Bläddra i källkod

[DependencyInjection] also check references of inlined services

Johannes Schmitt 14 år sedan
förälder
incheckning
fd5caa9546

+ 12 - 3
src/Symfony/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php

@@ -2,6 +2,8 @@
 
 namespace Symfony\Component\DependencyInjection\Compiler;
 
+use Symfony\Component\DependencyInjection\Definition;
+
 use Symfony\Component\DependencyInjection\Exception\NonExistentServiceException;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Reference;
@@ -23,17 +25,24 @@ class CheckExceptionOnInvalidReferenceBehaviorPass implements CompilerPassInterf
 
         foreach ($container->getDefinitions() as $id => $definition) {
             $this->sourceId = $id;
-            $this->processReferences($definition->getArguments());
-            $this->processReferences($definition->getMethodCalls());
-            $this->processReferences($definition->getProperties());
+            $this->processDefinition($definition);
         }
     }
 
+    private function processDefinition(Definition $definition)
+    {
+        $this->processReferences($definition->getArguments());
+        $this->processReferences($definition->getMethodCalls());
+        $this->processReferences($definition->getProperties());
+    }
+
     private function processReferences(array $arguments)
     {
         foreach ($arguments as $argument) {
             if (is_array($argument)) {
                 $this->processReferences($argument);
+            } else if ($argument instanceof Definition) {
+                $this->processDefinition($argument);
             } else if ($argument instanceof Reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE === $argument->getInvalidBehavior()) {
                 $destId = (string) $argument;
 

+ 20 - 0
tests/Symfony/Tests/Component/DependencyInjection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPassTest.php

@@ -2,6 +2,8 @@
 
 namespace Symfony\Tests\Component\DependencyInjection\Compiler;
 
+use Symfony\Component\DependencyInjection\Definition;
+
 use Symfony\Component\DependencyInjection\Compiler\CheckExceptionOnInvalidReferenceBehaviorPass;
 use Symfony\Component\DependencyInjection\Reference;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -34,6 +36,24 @@ class CheckExceptionOnInvalidReferenceBehaviorPassTest extends \PHPUnit_Framewor
         $this->process($container);
     }
 
+    /**
+     * @expectedException Symfony\Component\DependencyInjection\Exception\NonExistentServiceException
+     */
+    public function testProcessThrowsExceptionOnInvalidReferenceFromInlinedDefinition()
+    {
+        $container = new ContainerBuilder();
+
+        $def = new Definition();
+        $def->addArgument(new Reference('b'));
+
+        $container
+            ->register('a', '\stdClass')
+            ->addArgument($def)
+        ;
+
+        $this->process($container);
+    }
+
     private function process(ContainerBuilder $container)
     {
         $pass = new CheckExceptionOnInvalidReferenceBehaviorPass();