Repository navigation
Expand file tree
/
Copy pathEventProcessor.php
More file actions
executable file
·91 lines (75 loc) · 2.55 KB
/
Copy pathEventProcessor.php
File metadata and controls
executable file
·91 lines (75 loc) · 2.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php
/**
* Webiny Framework (http://www.webiny.com/framework)
*
* @copyright Copyright Webiny LTD
*/
namespace Webiny\Component\EventManager;
use Webiny\Component\StdLib\SingletonTrait;
use Webiny\Component\StdLib\StdLibTrait;
/**
* EventProcessor is a class that takes EventListeners and Event object and processes the event.
* @package Webiny\Component\EventManager
*/
class EventProcessor
{
use StdLibTrait, SingletonTrait;
/**
* Process given event
*
* @param array|ArrayObject $eventListeners EventListeners that are subscribed to this event
* @param Event $event Event data object
*
* @param null|string $resultType Type of event result to enforce (can be any class or interface name)
*
* @return array
*/
public function process($eventListeners, Event $event, $resultType = null)
{
$eventListeners = $this->_orderByPriority($eventListeners);
$results = [];
/* @var $eventListener EventListener */
foreach ($eventListeners as $eventListener) {
$handler = $eventListener->getHandler();
if ($this->isNull($handler)) {
continue;
}
$method = $eventListener->getMethod();
if ($this->isCallable($handler)) {
/** @var $handler \Closure */
$result = $handler($event);
} else {
$result = call_user_func_array([
$handler,
$method
], [$event]
);
}
if ($this->isNull($resultType) || (!$this->isNull($resultType) && $this->isInstanceOf($result, $resultType
))
) {
$results[] = $result;
}
if ($event->isPropagationStopped()) {
break;
}
}
return $results;
}
/**
* @param $eventListeners
*
* @return mixed
*/
private function _orderByPriority($eventListeners)
{
$comparisonFunction = function ($a, $b) {
if ($a->getPriority() == $b->getPriority()) {
// This will keep the order of same priority listeners in the order of subscribing
return 1;
}
return ($a->getPriority() > $b->getPriority()) ? -1 : 1;
};
return $this->arr($eventListeners)->sortUsingFunction($comparisonFunction)->val();
}
}