minor #22039 Skip abstract definitions in compiler passes (chalasr)
This PR was merged into the 3.3-dev branch.
Discussion
----------
Skip abstract definitions in compiler passes
| Q | A
| ------------- | ---
| Branch? | master
| Bug fix? | no
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #21761
| License | MIT
| Doc PR | n/a
Commits
-------
fc1ba0d64a
Skip abstract definitions in compiler passes
This commit is contained in:
commit
207d068a40
@ -79,7 +79,7 @@ class RegisterEventListenersAndSubscribersPass implements CompilerPassInterface
|
|||||||
uasort($subscribers, $sortFunc);
|
uasort($subscribers, $sortFunc);
|
||||||
foreach ($subscribers as $id => $instance) {
|
foreach ($subscribers as $id => $instance) {
|
||||||
if ($container->getDefinition($id)->isAbstract()) {
|
if ($container->getDefinition($id)->isAbstract()) {
|
||||||
throw new InvalidArgumentException(sprintf('The abstract service "%s" cannot be tagged as a doctrine event subscriber.', $id));
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$em->addMethodCall('addEventSubscriber', array(new Reference($id)));
|
$em->addMethodCall('addEventSubscriber', array(new Reference($id)));
|
||||||
@ -95,7 +95,7 @@ class RegisterEventListenersAndSubscribersPass implements CompilerPassInterface
|
|||||||
uasort($listeners, $sortFunc);
|
uasort($listeners, $sortFunc);
|
||||||
foreach ($listeners as $id => $instance) {
|
foreach ($listeners as $id => $instance) {
|
||||||
if ($container->getDefinition($id)->isAbstract()) {
|
if ($container->getDefinition($id)->isAbstract()) {
|
||||||
throw new InvalidArgumentException(sprintf('The abstract service "%s" cannot be tagged as a doctrine event listener.', $id));
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$em->addMethodCall('addEventListener', array(
|
$em->addMethodCall('addEventListener', array(
|
||||||
|
@ -18,9 +18,6 @@ use Symfony\Component\DependencyInjection\Definition;
|
|||||||
|
|
||||||
class RegisterEventListenersAndSubscribersPassTest extends TestCase
|
class RegisterEventListenersAndSubscribersPassTest extends TestCase
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* @expectedException \InvalidArgumentException
|
|
||||||
*/
|
|
||||||
public function testExceptionOnAbstractTaggedSubscriber()
|
public function testExceptionOnAbstractTaggedSubscriber()
|
||||||
{
|
{
|
||||||
$container = $this->createBuilder();
|
$container = $this->createBuilder();
|
||||||
@ -32,12 +29,10 @@ class RegisterEventListenersAndSubscribersPassTest extends TestCase
|
|||||||
$container->setDefinition('a', $abstractDefinition);
|
$container->setDefinition('a', $abstractDefinition);
|
||||||
|
|
||||||
$this->process($container);
|
$this->process($container);
|
||||||
|
$this->assertSame(array(), $container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function testAbstractTaggedListenerIsSkipped()
|
||||||
* @expectedException \InvalidArgumentException
|
|
||||||
*/
|
|
||||||
public function testExceptionOnAbstractTaggedListener()
|
|
||||||
{
|
{
|
||||||
$container = $this->createBuilder();
|
$container = $this->createBuilder();
|
||||||
|
|
||||||
@ -48,6 +43,7 @@ class RegisterEventListenersAndSubscribersPassTest extends TestCase
|
|||||||
$container->setDefinition('a', $abstractDefinition);
|
$container->setDefinition('a', $abstractDefinition);
|
||||||
|
|
||||||
$this->process($container);
|
$this->process($container);
|
||||||
|
$this->assertSame(array(), $container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testProcessEventListenersWithPriorities()
|
public function testProcessEventListenersWithPriorities()
|
||||||
|
@ -62,10 +62,6 @@ class AddConsoleCommandPassTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \InvalidArgumentException
|
|
||||||
* @expectedExceptionMessage The service "my-command" tagged "console.command" must not be abstract.
|
|
||||||
*/
|
|
||||||
public function testProcessThrowAnExceptionIfTheServiceIsAbstract()
|
public function testProcessThrowAnExceptionIfTheServiceIsAbstract()
|
||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
@ -77,6 +73,8 @@ class AddConsoleCommandPassTest extends TestCase
|
|||||||
$container->setDefinition('my-command', $definition);
|
$container->setDefinition('my-command', $definition);
|
||||||
|
|
||||||
$container->compile();
|
$container->compile();
|
||||||
|
|
||||||
|
$this->assertSame(array(), $container->getParameter('console.command.ids'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,7 +32,7 @@ class AddConsoleCommandPass implements CompilerPassInterface
|
|||||||
$definition = $container->getDefinition($id);
|
$definition = $container->getDefinition($id);
|
||||||
|
|
||||||
if ($definition->isAbstract()) {
|
if ($definition->isAbstract()) {
|
||||||
throw new \InvalidArgumentException(sprintf('The service "%s" tagged "console.command" must not be abstract.', $id));
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$class = $container->getParameterBag()->resolveValue($definition->getClass());
|
$class = $container->getParameterBag()->resolveValue($definition->getClass());
|
||||||
|
@ -50,11 +50,7 @@ class AddConsoleCommandPassTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function testProcessSkipAbstractDefinitions()
|
||||||
* @expectedException \InvalidArgumentException
|
|
||||||
* @expectedExceptionMessage The service "my-command" tagged "console.command" must not be abstract.
|
|
||||||
*/
|
|
||||||
public function testProcessThrowAnExceptionIfTheServiceIsAbstract()
|
|
||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
$container->setResourceTracking(false);
|
$container->setResourceTracking(false);
|
||||||
@ -66,6 +62,8 @@ class AddConsoleCommandPassTest extends TestCase
|
|||||||
$container->setDefinition('my-command', $definition);
|
$container->setDefinition('my-command', $definition);
|
||||||
|
|
||||||
$container->compile();
|
$container->compile();
|
||||||
|
|
||||||
|
$this->assertSame(array(), $container->getParameter('console.command.ids'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -63,7 +63,7 @@ class RegisterListenersPass implements CompilerPassInterface
|
|||||||
foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) {
|
foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) {
|
||||||
$def = $container->getDefinition($id);
|
$def = $container->getDefinition($id);
|
||||||
if ($def->isAbstract()) {
|
if ($def->isAbstract()) {
|
||||||
throw new InvalidArgumentException(sprintf('The service "%s" must not be abstract as event listeners are lazy-loaded.', $id));
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($events as $event) {
|
foreach ($events as $event) {
|
||||||
@ -90,7 +90,7 @@ class RegisterListenersPass implements CompilerPassInterface
|
|||||||
foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) {
|
foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) {
|
||||||
$def = $container->getDefinition($id);
|
$def = $container->getDefinition($id);
|
||||||
if ($def->isAbstract()) {
|
if ($def->isAbstract()) {
|
||||||
throw new InvalidArgumentException(sprintf('The service "%s" must not be abstract as event subscribers are lazy-loaded.', $id));
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We must assume that the class value has been correctly filled, even if the service is created by a factory
|
// We must assume that the class value has been correctly filled, even if the service is created by a factory
|
||||||
|
@ -87,10 +87,6 @@ class RegisterListenersPassTest extends TestCase
|
|||||||
$registerListenersPass->process($builder);
|
$registerListenersPass->process($builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException \InvalidArgumentException
|
|
||||||
* @expectedExceptionMessage The service "foo" must not be abstract as event listeners are lazy-loaded.
|
|
||||||
*/
|
|
||||||
public function testAbstractEventListener()
|
public function testAbstractEventListener()
|
||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
@ -99,13 +95,11 @@ class RegisterListenersPassTest extends TestCase
|
|||||||
|
|
||||||
$registerListenersPass = new RegisterListenersPass();
|
$registerListenersPass = new RegisterListenersPass();
|
||||||
$registerListenersPass->process($container);
|
$registerListenersPass->process($container);
|
||||||
|
|
||||||
|
$this->assertSame(array(), $container->getDefinition('event_dispatcher')->getMethodCalls());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function testAbstractEventSubscriberIsSkipped()
|
||||||
* @expectedException \InvalidArgumentException
|
|
||||||
* @expectedExceptionMessage The service "foo" must not be abstract as event subscribers are lazy-loaded.
|
|
||||||
*/
|
|
||||||
public function testAbstractEventSubscriber()
|
|
||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
$container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_subscriber', array());
|
$container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_subscriber', array());
|
||||||
@ -113,6 +107,8 @@ class RegisterListenersPassTest extends TestCase
|
|||||||
|
|
||||||
$registerListenersPass = new RegisterListenersPass();
|
$registerListenersPass = new RegisterListenersPass();
|
||||||
$registerListenersPass->process($container);
|
$registerListenersPass->process($container);
|
||||||
|
|
||||||
|
$this->assertSame(array(), $container->getDefinition('event_dispatcher')->getMethodCalls());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testEventSubscriberResolvableClassName()
|
public function testEventSubscriberResolvableClassName()
|
||||||
|
Reference in New Issue
Block a user