diff --git a/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php b/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php index a2081a3fd6..bbad4abe0e 100644 --- a/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php +++ b/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php @@ -68,6 +68,10 @@ 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)); + } + $em->addMethodCall('addEventSubscriber', array(new Reference($id))); } } @@ -78,6 +82,10 @@ 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)); + } + $em->addMethodCall('addEventListener', array( array_unique($instance['event']), isset($instance['lazy']) && $instance['lazy'] ? $id : new Reference($id), diff --git a/src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php b/src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php index e096de2e4b..24fbcdc9a6 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPassTest.php @@ -13,6 +13,7 @@ namespace Symfony\Bridge\Doctrine\Tests\DependencyInjection\CompilerPass; use Symfony\Bridge\Doctrine\DependencyInjection\CompilerPass\RegisterEventListenersAndSubscribersPass; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; class RegisterEventListenersAndSubscribersPassTest extends \PHPUnit_Framework_TestCase { @@ -23,6 +24,38 @@ class RegisterEventListenersAndSubscribersPassTest extends \PHPUnit_Framework_Te } } + /** + * @expectedException InvalidArgumentException + */ + public function testExceptionOnAbstractTaggedSubscriber() + { + $container = $this->createBuilder(); + + $abstractDefinition = new Definition('stdClass'); + $abstractDefinition->setAbstract(true); + $abstractDefinition->addTag('doctrine.event_subscriber'); + + $container->setDefinition('a', $abstractDefinition); + + $this->process($container); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testExceptionOnAbstractTaggedListener() + { + $container = $this->createBuilder(); + + $abstractDefinition = new Definition('stdClass'); + $abstractDefinition->setAbstract(true); + $abstractDefinition->addTag('doctrine.event_listener', array('event' => 'test')); + + $container->setDefinition('a', $abstractDefinition); + + $this->process($container); + } + public function testProcessEventListenersWithPriorities() { $container = $this->createBuilder();