Classes List

Symfony\Component\DependencyInjection\Compiler\ResolveNamedArgumentsPass

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
 54 
 55 
 56 
 57 
 58 
 59 
 60 
 61 
 62 
 63 
 64 
 65 
 66 
 67 
 68 
 69 
 70 
 71 
 72 
 73 
 74 
 75 
 76 
 77 
 78 
 79 
 80 
 81 
 82 
 83 
 84 
 85 
 86 
 87 
 88 
 89 
 90 
 91 
 92 
 93 
 94 
 95 
 96 
 97 
 98 
 99 
 100 
 101 
 102 
<?php

/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */


namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\LazyProxy\ProxyHelper;
use Symfony\Component\DependencyInjection\Reference;

/** * Resolves named arguments to their corresponding numeric index. * * @author Kévin Dunglas <dunglas@gmail.com> */
class ResolveNamedArgumentsPass extends AbstractRecursivePass
{
    /** * {@inheritdoc} */
    protected function processValue($value$isRoot = false)
    {
        if (!$value instanceof Definition) {
            return parent::processValue($value$isRoot);
        }

        $calls = $value->getMethodCalls();
        $calls[] = array('__construct'$value->getArguments());

        foreach ($calls as $i => $call) {
            list($method$arguments) = $call;
            $parameters = null;
            $resolvedArguments = array();

            foreach ($arguments as $key => $argument) {
                if (is_int($key)) {
                    $resolvedArguments[$key] = $argument;
                    continue;
                }

                if (null === $parameters) {
                    $r = $this->getReflectionMethod($value$method);
                    $class = $r instanceof \ReflectionMethod ? $r->class : $this->currentId;
                    $parameters = $r->getParameters();
                }

                if (isset($key[0]) && '$' === $key[0]) {
                    foreach ($parameters as $j => $p) {
                        if ($key === '$'.$p->name) {
                            $resolvedArguments[$j] = $argument;

                            continue 2;
                        }
                    }

                    throw new InvalidArgumentException(sprintf('Invalid service "%s": method "%s()" has no argument named "%s". Check your service definition.'$this->currentId$class !== $this->currentId ? $class.'::'.$method : $method$key));
                }

                if (null !== $argument && !$argument instanceof Reference && !$argument instanceof Definition) {
                    throw new InvalidArgumentException(sprintf('Invalid service "%s": the value of argument "%s" of method "%s()" must be null, an instance of %s or an instance of %s, %s given.'$this->currentId$key$class !== $this->currentId ? $class.'::'.$method : $methodReference::classDefinition::classgettype($argument)));
                }

                $typeFound = false;
                foreach ($parameters as $j => $p) {
                    if (!array_key_exists($j$resolvedArguments&& ProxyHelper::getTypeHint($r$ptrue=== $key) {
                        $resolvedArguments[$j] = $argument;
                        $typeFound = true;
                    }
                }

                if (!$typeFound) {
                    throw new InvalidArgumentException(sprintf('Invalid service "%s": method "%s()" has no argument type-hinted as "%s". Check your service definition.'$this->currentId$class !== $this->currentId ? $class.'::'.$method : $method$key));
                }
            }

            if ($resolvedArguments !== $call[1]) {
                ksort($resolvedArguments);
                $calls[$i][1] = $resolvedArguments;
            }
        }

        list(, $arguments) = array_pop($calls);

        if ($arguments !== $value->getArguments()) {
            $value->setArguments($arguments);
        }
        if ($calls !== $value->getMethodCalls()) {
            $value->setMethodCalls($calls);
        }

        return parent::processValue($value$isRoot);
    }
}