Skip to content

Commit 8a870c2

Browse files
committed
bug #13293 [EventDispatcher] Add missing checks to RegisterListenersPass (znerol)
This PR was submitted for the 2.7 branch but it was merged into the 2.3 branch instead (closes #13293). Discussion ---------- [EventDispatcher] Add missing checks to RegisterListenersPass * Support services using a parameter for their class name. * Prevent abstract services as event subscribers. | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | | License | MIT | Doc PR | Commits ------- 0a50b63 [EventDispatcher] Add missing checks to RegisterListenersPass
2 parents 689cf99 + 0a50b63 commit 8a870c2

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

src/Symfony/Component/HttpKernel/DependencyInjection/RegisterListenersPass.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,12 @@ public function process(ContainerBuilder $container)
9191
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id));
9292
}
9393

94+
if ($def->isAbstract()) {
95+
throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event subscribers are lazy-loaded.', $id));
96+
}
97+
9498
// We must assume that the class value has been correctly filled, even if the service is created by a factory
95-
$class = $def->getClass();
99+
$class = $container->getParameterBag()->resolveValue($def->getClass());
96100

97101
$refClass = new \ReflectionClass($class);
98102
$interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface';

src/Symfony/Component/HttpKernel/Tests/DependencyInjection/RegisterListenersPassTest.php

+52
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,58 @@ public function testAbstractEventListener()
135135
$registerListenersPass = new RegisterListenersPass();
136136
$registerListenersPass->process($container);
137137
}
138+
139+
/**
140+
* @expectedException \InvalidArgumentException
141+
* @expectedExceptionMessage The service "foo" must not be abstract as event subscribers are lazy-loaded.
142+
*/
143+
public function testAbstractEventSubscriber()
144+
{
145+
$container = new ContainerBuilder();
146+
$container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_subscriber', array());
147+
$container->register('event_dispatcher', 'stdClass');
148+
149+
$registerListenersPass = new RegisterListenersPass();
150+
$registerListenersPass->process($container);
151+
}
152+
153+
public function testEventSubscriberResolvableClassName()
154+
{
155+
$container = new ContainerBuilder();
156+
157+
$container->setParameter('subscriber.class', 'Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService');
158+
$container->register('foo', '%subscriber.class%')->addTag('kernel.event_subscriber', array());
159+
$container->register('event_dispatcher', 'stdClass');
160+
161+
$registerListenersPass = new RegisterListenersPass();
162+
$registerListenersPass->process($container);
163+
164+
$definition = $container->getDefinition('event_dispatcher');
165+
$expected_calls = array(
166+
array(
167+
'addSubscriberService',
168+
array(
169+
'foo',
170+
'Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService',
171+
),
172+
),
173+
);
174+
$this->assertSame($expected_calls, $definition->getMethodCalls());
175+
}
176+
177+
/**
178+
* @expectedException \InvalidArgumentException
179+
* @expectedExceptionMessage You have requested a non-existent parameter "subscriber.class"
180+
*/
181+
public function testEventSubscriberUnresolvableClassName()
182+
{
183+
$container = new ContainerBuilder();
184+
$container->register('foo', '%subscriber.class%')->addTag('kernel.event_subscriber', array());
185+
$container->register('event_dispatcher', 'stdClass');
186+
187+
$registerListenersPass = new RegisterListenersPass();
188+
$registerListenersPass->process($container);
189+
}
138190
}
139191

140192
class SubscriberService implements \Symfony\Component\EventDispatcher\EventSubscriberInterface

0 commit comments

Comments
 (0)