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:
Fabien Potencier 2017-03-17 09:47:45 -07:00
commit 207d068a40
7 changed files with 18 additions and 30 deletions

View File

@ -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(

View File

@ -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()

View File

@ -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'));
} }
/** /**

View File

@ -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());

View File

@ -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'));
} }
/** /**

View File

@ -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

View File

@ -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()