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);
foreach ($subscribers as $id => $instance) {
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)));
@ -95,7 +95,7 @@ class RegisterEventListenersAndSubscribersPass implements CompilerPassInterface
uasort($listeners, $sortFunc);
foreach ($listeners as $id => $instance) {
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(

View File

@ -18,9 +18,6 @@ use Symfony\Component\DependencyInjection\Definition;
class RegisterEventListenersAndSubscribersPassTest extends TestCase
{
/**
* @expectedException \InvalidArgumentException
*/
public function testExceptionOnAbstractTaggedSubscriber()
{
$container = $this->createBuilder();
@ -32,12 +29,10 @@ class RegisterEventListenersAndSubscribersPassTest extends TestCase
$container->setDefinition('a', $abstractDefinition);
$this->process($container);
$this->assertSame(array(), $container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls());
}
/**
* @expectedException \InvalidArgumentException
*/
public function testExceptionOnAbstractTaggedListener()
public function testAbstractTaggedListenerIsSkipped()
{
$container = $this->createBuilder();
@ -48,6 +43,7 @@ class RegisterEventListenersAndSubscribersPassTest extends TestCase
$container->setDefinition('a', $abstractDefinition);
$this->process($container);
$this->assertSame(array(), $container->getDefinition('doctrine.dbal.default_connection.event_manager')->getMethodCalls());
}
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()
{
$container = new ContainerBuilder();
@ -77,6 +73,8 @@ class AddConsoleCommandPassTest extends TestCase
$container->setDefinition('my-command', $definition);
$container->compile();
$this->assertSame(array(), $container->getParameter('console.command.ids'));
}
/**

View File

@ -32,7 +32,7 @@ class AddConsoleCommandPass implements CompilerPassInterface
$definition = $container->getDefinition($id);
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());

View File

@ -50,11 +50,7 @@ class AddConsoleCommandPassTest extends TestCase
);
}
/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage The service "my-command" tagged "console.command" must not be abstract.
*/
public function testProcessThrowAnExceptionIfTheServiceIsAbstract()
public function testProcessSkipAbstractDefinitions()
{
$container = new ContainerBuilder();
$container->setResourceTracking(false);
@ -66,6 +62,8 @@ class AddConsoleCommandPassTest extends TestCase
$container->setDefinition('my-command', $definition);
$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) {
$def = $container->getDefinition($id);
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) {
@ -90,7 +90,7 @@ class RegisterListenersPass implements CompilerPassInterface
foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) {
$def = $container->getDefinition($id);
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

View File

@ -87,10 +87,6 @@ class RegisterListenersPassTest extends TestCase
$registerListenersPass->process($builder);
}
/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage The service "foo" must not be abstract as event listeners are lazy-loaded.
*/
public function testAbstractEventListener()
{
$container = new ContainerBuilder();
@ -99,13 +95,11 @@ class RegisterListenersPassTest extends TestCase
$registerListenersPass = new RegisterListenersPass();
$registerListenersPass->process($container);
$this->assertSame(array(), $container->getDefinition('event_dispatcher')->getMethodCalls());
}
/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage The service "foo" must not be abstract as event subscribers are lazy-loaded.
*/
public function testAbstractEventSubscriber()
public function testAbstractEventSubscriberIsSkipped()
{
$container = new ContainerBuilder();
$container->register('foo', 'stdClass')->setAbstract(true)->addTag('kernel.event_subscriber', array());
@ -113,6 +107,8 @@ class RegisterListenersPassTest extends TestCase
$registerListenersPass = new RegisterListenersPass();
$registerListenersPass->process($container);
$this->assertSame(array(), $container->getDefinition('event_dispatcher')->getMethodCalls());
}
public function testEventSubscriberResolvableClassName()