24
24
* @author Fabien Potencier <fabien@symfony.com>
25
25
* @author Jordi Boggiano <j.boggiano@seld.be>
26
26
* @author Jordan Alliot <jordan.alliot@gmail.com>
27
+ * @author Nicolas Grekas <p@tchwork.com>
27
28
*/
28
29
class EventDispatcher implements EventDispatcherInterface
29
30
{
@@ -52,7 +53,7 @@ public function dispatch($eventName, Event $event = null)
52
53
public function getListeners ($ eventName = null )
53
54
{
54
55
if (null !== $ eventName ) {
55
- if (! isset ($ this ->listeners [$ eventName ])) {
56
+ if (empty ($ this ->listeners [$ eventName ])) {
56
57
return array ();
57
58
}
58
59
@@ -77,13 +78,23 @@ public function getListeners($eventName = null)
77
78
*/
78
79
public function getListenerPriority ($ eventName , $ listener )
79
80
{
80
- if (! isset ($ this ->listeners [$ eventName ])) {
81
+ if (empty ($ this ->listeners [$ eventName ])) {
81
82
return ;
82
83
}
83
84
85
+ if (is_array ($ listener ) && isset ($ listener [0 ]) && $ listener [0 ] instanceof \Closure) {
86
+ $ listener [0 ] = $ listener [0 ]();
87
+ }
88
+
84
89
foreach ($ this ->listeners [$ eventName ] as $ priority => $ listeners ) {
85
- if (false !== in_array ($ listener , $ listeners , true )) {
86
- return $ priority ;
90
+ foreach ($ listeners as $ k => $ v ) {
91
+ if ($ v !== $ listener && is_array ($ v ) && isset ($ v [0 ]) && $ v [0 ] instanceof \Closure) {
92
+ $ v [0 ] = $ v [0 ]();
93
+ $ this ->listeners [$ eventName ][$ priority ][$ k ] = $ v ;
94
+ }
95
+ if ($ v === $ listener ) {
96
+ return $ priority ;
97
+ }
87
98
}
88
99
}
89
100
}
@@ -93,7 +104,17 @@ public function getListenerPriority($eventName, $listener)
93
104
*/
94
105
public function hasListeners ($ eventName = null )
95
106
{
96
- return (bool ) $ this ->getListeners ($ eventName );
107
+ if (null !== $ eventName ) {
108
+ return !empty ($ this ->listeners [$ eventName ]);
109
+ }
110
+
111
+ foreach ($ this ->listeners as $ eventListeners ) {
112
+ if ($ eventListeners ) {
113
+ return true ;
114
+ }
115
+ }
116
+
117
+ return false ;
97
118
}
98
119
99
120
/**
@@ -110,13 +131,30 @@ public function addListener($eventName, $listener, $priority = 0)
110
131
*/
111
132
public function removeListener ($ eventName , $ listener )
112
133
{
113
- if (! isset ($ this ->listeners [$ eventName ])) {
134
+ if (empty ($ this ->listeners [$ eventName ])) {
114
135
return ;
115
136
}
116
137
138
+ if (is_array ($ listener ) && isset ($ listener [0 ]) && $ listener [0 ] instanceof \Closure) {
139
+ $ listener [0 ] = $ listener [0 ]();
140
+ }
141
+
117
142
foreach ($ this ->listeners [$ eventName ] as $ priority => $ listeners ) {
118
- if (false !== ($ key = array_search ($ listener , $ listeners , true ))) {
119
- unset($ this ->listeners [$ eventName ][$ priority ][$ key ], $ this ->sorted [$ eventName ]);
143
+ foreach ($ listeners as $ k => $ v ) {
144
+ if ($ v !== $ listener && is_array ($ v ) && isset ($ v [0 ]) && $ v [0 ] instanceof \Closure) {
145
+ $ v [0 ] = $ v [0 ]();
146
+ }
147
+ if ($ v === $ listener ) {
148
+ unset($ listeners [$ k ], $ this ->sorted [$ eventName ]);
149
+ } else {
150
+ $ listeners [$ k ] = $ v ;
151
+ }
152
+ }
153
+
154
+ if ($ listeners ) {
155
+ $ this ->listeners [$ eventName ][$ priority ] = $ listeners ;
156
+ } else {
157
+ unset($ this ->listeners [$ eventName ][$ priority ]);
120
158
}
121
159
}
122
160
}
@@ -183,6 +221,16 @@ protected function doDispatch($listeners, $eventName, Event $event)
183
221
private function sortListeners ($ eventName )
184
222
{
185
223
krsort ($ this ->listeners [$ eventName ]);
186
- $ this ->sorted [$ eventName ] = call_user_func_array ('array_merge ' , $ this ->listeners [$ eventName ]);
224
+ $ this ->sorted [$ eventName ] = array ();
225
+
226
+ foreach ($ this ->listeners [$ eventName ] as $ priority => $ listeners ) {
227
+ foreach ($ listeners as $ k => $ listener ) {
228
+ if (is_array ($ listener ) && isset ($ listener [0 ]) && $ listener [0 ] instanceof \Closure) {
229
+ $ listener [0 ] = $ listener [0 ]();
230
+ $ this ->listeners [$ eventName ][$ priority ][$ k ] = $ listener ;
231
+ }
232
+ $ this ->sorted [$ eventName ][] = $ listener ;
233
+ }
234
+ }
187
235
}
188
236
}
0 commit comments