@@ -202,18 +202,25 @@ public function testInvokableEventListener()
202
202
$ container = new ContainerBuilder ();
203
203
$ container ->setParameter ('event_dispatcher.event_aliases ' , [AliasedEvent::class => 'aliased_event ' ]);
204
204
205
- $ container ->register ('foo ' , \get_class (new class {
205
+ $ container ->register ('foo ' , \get_class (new class () {
206
206
public function onFooBar ()
207
207
{
208
208
}
209
209
}))->addTag ('kernel.event_listener ' , ['event ' => 'foo.bar ' ]);
210
210
$ container ->register ('bar ' , InvokableListenerService::class)->addTag ('kernel.event_listener ' , ['event ' => 'foo.bar ' ]);
211
211
$ container ->register ('baz ' , InvokableListenerService::class)->addTag ('kernel.event_listener ' , ['event ' => 'event ' ]);
212
- $ container ->register ('zar ' , \get_class (new class {
212
+ $ container ->register ('zar ' , \get_class (new class () {
213
213
public function onFooBarZar ()
214
214
{
215
215
}
216
216
}))->addTag ('kernel.event_listener ' , ['event ' => 'foo.bar_zar ' ]);
217
+ $ container ->register ('typed_listener ' , InvokableListenerService::class)->addTag ('kernel.event_listener ' , ['event ' => CustomEvent::class]);
218
+ $ container ->register ('aliased_event ' , InvokableListenerService::class)->addTag ('kernel.event_listener ' , ['event ' => 'aliased_event ' ]);
219
+ $ container ->register ('child_event ' , \get_class (new class () {
220
+ public function __invoke (ParentEvent $ event )
221
+ {
222
+ }
223
+ }))->addTag ('kernel.event_listener ' , ['event ' => ChildEvent::class]);
217
224
$ container ->register ('event_dispatcher ' , \stdClass::class);
218
225
219
226
$ registerListenersPass = new RegisterListenersPass ();
@@ -253,18 +260,68 @@ public function onFooBarZar()
253
260
0 ,
254
261
],
255
262
],
263
+ [
264
+ 'addListener ' ,
265
+ [
266
+ CustomEvent::class,
267
+ [new ServiceClosureArgument (new Reference ('typed_listener ' )), 'onCustomEvent ' ],
268
+ 0 ,
269
+ ],
270
+ ],
271
+ [
272
+ 'addListener ' ,
273
+ [
274
+ 'aliased_event ' ,
275
+ [new ServiceClosureArgument (new Reference ('aliased_event ' )), 'onAliasedEvent ' ],
276
+ 0 ,
277
+ ],
278
+ ],
279
+ [
280
+ 'addListener ' ,
281
+ [
282
+ ChildEvent::class,
283
+ [new ServiceClosureArgument (new Reference ('child_event ' )), '__invoke ' ],
284
+ 0 ,
285
+ ],
286
+ ],
256
287
];
257
288
$ this ->assertEquals ($ expectedCalls , $ definition ->getMethodCalls ());
258
289
}
259
290
260
- public function testItThrowsAnExceptionIfTagIsMissingMethodAndClassHasNoValidMethod ()
291
+ public function testItThrowsAnExceptionIfTagIsMissingMethodAndClassHasMultipleMethodsWithEvent ()
292
+ {
293
+ $ this ->expectException (InvalidArgumentException::class);
294
+ $ this ->expectExceptionMessage ('Service "foo" is missing a "method" attribute on "kernel.event_listener" tags. ' );
295
+
296
+ $ container = new ContainerBuilder ();
297
+
298
+ $ container ->register ('foo ' , \get_class (new class () {
299
+ public function doSomethingOnCustomEvent (CustomEvent $ event )
300
+ {
301
+ }
302
+
303
+ public function doAnotherThingOnCustomEvent (CustomEvent $ event )
304
+ {
305
+ }
306
+ }))->addTag ('kernel.event_listener ' , ['event ' => CustomEvent::class]);
307
+ $ container ->register ('event_dispatcher ' , \stdClass::class);
308
+
309
+ $ registerListenersPass = new RegisterListenersPass ();
310
+ $ registerListenersPass ->process ($ container );
311
+ }
312
+
313
+ public function testItThrowsAnExceptionIfTagIsMissingMethodAndClassHasNoMethodWithEvent ()
261
314
{
262
315
$ this ->expectException (InvalidArgumentException::class);
263
- $ this ->expectExceptionMessage ('None of the "onFooBar" or "__invoke" methods exist for the service " foo". Please define the "method" attribute on "kernel.event_listener" tags. ' );
316
+ $ this ->expectExceptionMessage ('Service " foo" is missing a "method" attribute on "kernel.event_listener" tags. ' );
264
317
265
318
$ container = new ContainerBuilder ();
266
319
267
- $ container ->register ('foo ' , \stdClass::class)->addTag ('kernel.event_listener ' , ['event ' => 'foo.bar ' ]);
320
+ $ container ->register ('foo ' , \get_class (new class () {
321
+ public function doSomethingOnCustomEvent ($ event )
322
+ {
323
+ }
324
+ }))->addTag ('kernel.event_listener ' , ['event ' => CustomEvent::class]);
268
325
$ container ->register ('event_dispatcher ' , \stdClass::class);
269
326
270
327
$ registerListenersPass = new RegisterListenersPass ();
@@ -524,6 +581,14 @@ public function __invoke()
524
581
public function onEvent ()
525
582
{
526
583
}
584
+
585
+ public function onCustomEvent (CustomEvent $ event ): void
586
+ {
587
+ }
588
+
589
+ public function onAliasedEvent (AliasedEvent $ event ): void
590
+ {
591
+ }
527
592
}
528
593
529
594
final class AliasedSubscriber implements EventSubscriberInterface
@@ -541,6 +606,14 @@ final class AliasedEvent
541
606
{
542
607
}
543
608
609
+ class ParentEvent
610
+ {
611
+ }
612
+
613
+ final class ChildEvent extends ParentEvent
614
+ {
615
+ }
616
+
544
617
final class TypedListener
545
618
{
546
619
public function __invoke (AliasedEvent $ event ): void
0 commit comments