Skip to content

Commit 16bfee1

Browse files
Merge branch '5.4' into 6.2
* 5.4: cs fix [Messenger] Fix passing options set via tags to handler descriptors random_bytes length should be an int greater than 0 enforce UTC timezone in test [DependencyInjection] Fix autocasting null env values to empty string Fix executable bit Readme: Replace Stack Overflow with GitHub Discussions [DependencyInjection] Fix annotation [String] Fix Inflector for 'status' [EventDispatcher] [EventDispatcher] Throw exception when listener method cannot be resolved
2 parents 04046f3 + 59646f4 commit 16bfee1

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

DependencyInjection/RegisterListenersPass.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,11 @@ public function process(ContainerBuilder $container)
8686
], function ($matches) { return strtoupper($matches[0]); }, $event['event']);
8787
$event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);
8888

89-
if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method']) && $r->hasMethod('__invoke')) {
89+
if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method'])) {
90+
if (!$r->hasMethod('__invoke')) {
91+
throw new InvalidArgumentException(sprintf('None of the "%s" or "__invoke" methods exist for the service "foo". Please define the "method" attribute on "kernel.event_listener" tags.', $event['method'], $id, $this->listenerTag));
92+
}
93+
9094
$event['method'] = '__invoke';
9195
}
9296
}

Tests/DependencyInjection/RegisterListenersPassTest.php

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,20 @@ public function testEventSubscriberUnresolvableClassName()
200200
public function testInvokableEventListener()
201201
{
202202
$container = new ContainerBuilder();
203-
$container->register('foo', \stdClass::class)->addTag('kernel.event_listener', ['event' => 'foo.bar']);
203+
$container->setParameter('event_dispatcher.event_aliases', [AliasedEvent::class => 'aliased_event']);
204+
205+
$container->register('foo', \get_class(new class() {
206+
public function onFooBar()
207+
{
208+
}
209+
}))->addTag('kernel.event_listener', ['event' => 'foo.bar']);
204210
$container->register('bar', InvokableListenerService::class)->addTag('kernel.event_listener', ['event' => 'foo.bar']);
205211
$container->register('baz', InvokableListenerService::class)->addTag('kernel.event_listener', ['event' => 'event']);
206-
$container->register('zar', \stdClass::class)->addTag('kernel.event_listener', ['event' => 'foo.bar_zar']);
212+
$container->register('zar', \get_class(new class() {
213+
public function onFooBarZar()
214+
{
215+
}
216+
}))->addTag('kernel.event_listener', ['event' => 'foo.bar_zar']);
207217
$container->register('event_dispatcher', \stdClass::class);
208218

209219
$registerListenersPass = new RegisterListenersPass();
@@ -247,6 +257,20 @@ public function testInvokableEventListener()
247257
$this->assertEquals($expectedCalls, $definition->getMethodCalls());
248258
}
249259

260+
public function testItThrowsAnExceptionIfTagIsMissingMethodAndClassHasNoValidMethod()
261+
{
262+
$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.');
264+
265+
$container = new ContainerBuilder();
266+
267+
$container->register('foo', \stdClass::class)->addTag('kernel.event_listener', ['event' => 'foo.bar']);
268+
$container->register('event_dispatcher', \stdClass::class);
269+
270+
$registerListenersPass = new RegisterListenersPass();
271+
$registerListenersPass->process($container);
272+
}
273+
250274
public function testTaggedInvokableEventListener()
251275
{
252276
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)