Skip to content

Commit

Permalink
Merge branch '5.4' into 6.2
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
nicolas-grekas committed Jul 5, 2023
2 parents 04046f3 + 59646f4 commit 16bfee1
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
6 changes: 5 additions & 1 deletion DependencyInjection/RegisterListenersPass.php
Expand Up @@ -86,7 +86,11 @@ public function process(ContainerBuilder $container)
], function ($matches) { return strtoupper($matches[0]); }, $event['event']);
$event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']);

if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method']) && $r->hasMethod('__invoke')) {
if (null !== ($class = $container->getDefinition($id)->getClass()) && ($r = $container->getReflectionClass($class, false)) && !$r->hasMethod($event['method'])) {
if (!$r->hasMethod('__invoke')) {
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));
}

$event['method'] = '__invoke';
}
}
Expand Down
28 changes: 26 additions & 2 deletions Tests/DependencyInjection/RegisterListenersPassTest.php
Expand Up @@ -200,10 +200,20 @@ public function testEventSubscriberUnresolvableClassName()
public function testInvokableEventListener()
{
$container = new ContainerBuilder();
$container->register('foo', \stdClass::class)->addTag('kernel.event_listener', ['event' => 'foo.bar']);
$container->setParameter('event_dispatcher.event_aliases', [AliasedEvent::class => 'aliased_event']);

$container->register('foo', \get_class(new class() {
public function onFooBar()
{
}
}))->addTag('kernel.event_listener', ['event' => 'foo.bar']);
$container->register('bar', InvokableListenerService::class)->addTag('kernel.event_listener', ['event' => 'foo.bar']);
$container->register('baz', InvokableListenerService::class)->addTag('kernel.event_listener', ['event' => 'event']);
$container->register('zar', \stdClass::class)->addTag('kernel.event_listener', ['event' => 'foo.bar_zar']);
$container->register('zar', \get_class(new class() {
public function onFooBarZar()
{
}
}))->addTag('kernel.event_listener', ['event' => 'foo.bar_zar']);
$container->register('event_dispatcher', \stdClass::class);

$registerListenersPass = new RegisterListenersPass();
Expand Down Expand Up @@ -247,6 +257,20 @@ public function testInvokableEventListener()
$this->assertEquals($expectedCalls, $definition->getMethodCalls());
}

public function testItThrowsAnExceptionIfTagIsMissingMethodAndClassHasNoValidMethod()
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('None of the "onFooBar" or "__invoke" methods exist for the service "foo". Please define the "method" attribute on "kernel.event_listener" tags.');

$container = new ContainerBuilder();

$container->register('foo', \stdClass::class)->addTag('kernel.event_listener', ['event' => 'foo.bar']);
$container->register('event_dispatcher', \stdClass::class);

$registerListenersPass = new RegisterListenersPass();
$registerListenersPass->process($container);
}

public function testTaggedInvokableEventListener()
{
$container = new ContainerBuilder();
Expand Down

0 comments on commit 16bfee1

Please sign in to comment.