vendor/symfony/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php
author ymh <ymh.work@gmail.com>
Sat, 24 Sep 2011 15:40:41 +0200
changeset 0 7f95f8617b0b
permissions -rwxr-xr-x
first commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of the Symfony package.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Symfony\Component\DependencyInjection\Dumper;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
use Symfony\Component\DependencyInjection\Variable;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
use Symfony\Component\DependencyInjection\Definition;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
use Symfony\Component\DependencyInjection\ContainerBuilder;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
use Symfony\Component\DependencyInjection\Container;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
use Symfony\Component\DependencyInjection\ContainerInterface;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
use Symfony\Component\DependencyInjection\Reference;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
use Symfony\Component\DependencyInjection\Parameter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
 * PhpDumper dumps a service container as a PHP class.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
 * @author Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
 * @author Johannes M. Schmitt <schmittjoh@gmail.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
 * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
class PhpDumper extends Dumper
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
     * Characters that might appear in the generated variable name as first character
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
     * @var string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    const FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
     * Characters that might appear in the generated variable name as any but the first character
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
     * @var string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    const NON_FIRST_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789_';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    private $inlinedDefinitions;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    private $definitionVariables;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    private $referenceVariables;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    private $variableCount;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    private $reservedVariables = array('instance', 'class');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
     * {@inheritDoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    public function __construct(ContainerBuilder $container)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        parent::__construct($container);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        $this->inlinedDefinitions = new \SplObjectStorage;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
     * Dumps the service container as a PHP class.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
     * Available options:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
     *  * class:      The class name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
     *  * base_class: The base class name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
     * @param  array  $options An array of options
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
     * @return string A PHP class representing of the service container
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    public function dump(array $options = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
        $options = array_merge(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
            'class'      => 'ProjectServiceContainer',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
            'base_class' => 'Container',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        ), $options);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        $code = $this->startClass($options['class'], $options['base_class']);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
        if ($this->container->isFrozen()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
            $code .= $this->addFrozenConstructor();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
            $code .= $this->addConstructor();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
        $code .=
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
            $this->addServices().
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
            $this->addDefaultParametersMethod().
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
            $this->endClass()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
        ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
     * Generates Service local temp variables.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
     * @param string $cId
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
     * @param string $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    private function addServiceLocalTempVariables($cId, $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        static $template = "        \$%s = %s;\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        $localDefinitions = array_merge(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
            array($definition),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
            $this->getInlinedDefinitions($definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        $calls = $behavior = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        foreach ($localDefinitions as $iDefinition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
            $this->getServiceCallsFromArguments($iDefinition->getArguments(), $calls, $behavior);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
            $this->getServiceCallsFromArguments($iDefinition->getMethodCalls(), $calls, $behavior);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
            $this->getServiceCallsFromArguments($iDefinition->getProperties(), $calls, $behavior);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        $code = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        foreach ($calls as $id => $callCount) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
            if ('service_container' === $id || $id === $cId) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
                continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
            if ($callCount > 1) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
                $name = $this->getNextVariableName();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
                $this->referenceVariables[$id] = new Variable($name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
                if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE === $behavior[$id]) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
                    $code .= sprintf($template, $name, $this->getServiceCall($id));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
                } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
                    $code .= sprintf($template, $name, $this->getServiceCall($id, new Reference($id, ContainerInterface::NULL_ON_INVALID_REFERENCE)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
        if ('' !== $code) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
            $code .= "\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
     * Generates the require_once statement for service includes.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
     * @param string $id The service id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
    private function addServiceInclude($id, $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
        $template = "        require_once %s;\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
        $code = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
        if (null !== $file = $definition->getFile()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
            $code .= sprintf($template, $this->dumpValue($file));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
        foreach ($this->getInlinedDefinitions($definition) as $definition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
            if (null !== $file = $definition->getFile()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
                $code .= sprintf($template, $this->dumpValue($file));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
        if ('' !== $code) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
            $code .= "\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
     * Generates the inline definition of a service.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
     * @param string $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
    private function addServiceInlinedDefinitions($id, $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
        $code = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
        $variableMap = $this->definitionVariables;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
        $nbOccurrences = new \SplObjectStorage();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
        $processed = new \SplObjectStorage();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
        $inlinedDefinitions = $this->getInlinedDefinitions($definition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
        foreach ($inlinedDefinitions as $definition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
            if (false === $nbOccurrences->contains($definition)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
                $nbOccurrences->offsetSet($definition, 1);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
                $i = $nbOccurrences->offsetGet($definition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
                $nbOccurrences->offsetSet($definition, $i+1);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
        foreach ($inlinedDefinitions as $sDefinition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
            if ($processed->contains($sDefinition)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
                continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
            $processed->offsetSet($sDefinition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
            $class = $this->dumpValue($sDefinition->getClass());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
            if ($nbOccurrences->offsetGet($sDefinition) > 1 || count($sDefinition->getMethodCalls()) > 0 || $sDefinition->getProperties() || null !== $sDefinition->getConfigurator() || false !== strpos($class, '$')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
                $name = $this->getNextVariableName();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
                $variableMap->offsetSet($sDefinition, new Variable($name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
                // a construct like:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
                // $a = new ServiceA(ServiceB $b); $b = new ServiceB(ServiceA $a);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
                // this is an indication for a wrong implementation, you can circumvent this problem
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
                // by setting up your service structure like this:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
                // $b = new ServiceB();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
                // $a = new ServiceA(ServiceB $b);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
                // $b->setServiceA(ServiceA $a);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
                if ($this->hasReference($id, $sDefinition->getArguments())) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
                    throw new ServiceCircularReferenceException($id, array($id));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
                $arguments = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
                foreach ($sDefinition->getArguments() as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
                    $arguments[] = $this->dumpValue($argument);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
                if (null !== $sDefinition->getFactoryMethod()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
                    if (null !== $sDefinition->getFactoryClass()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
                        $code .= sprintf("        \$%s = call_user_func(array(%s, '%s')%s);\n", $name, $this->dumpValue($sDefinition->getFactoryClass()), $sDefinition->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
                    } elseif (null !== $sDefinition->getFactoryService()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
                        $code .= sprintf("        \$%s = %s->%s(%s);\n", $name, $this->getServiceCall($sDefinition->getFactoryService()), $sDefinition->getFactoryMethod(), implode(', ', $arguments));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
                    } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
                        throw new \RuntimeException('Factory service or factory class must be defined in service definition for '.$id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
                } elseif (false !== strpos($class, '$')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
                    $code .= sprintf("        \$class = %s;\n        \$%s = new \$class(%s);\n", $class, $name, implode(', ', $arguments));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
                } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
                    $code .= sprintf("        \$%s = new \\%s(%s);\n", $name, substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
                if (!$this->hasReference($id, $sDefinition->getMethodCalls()) && !$this->hasReference($id, $sDefinition->getProperties())) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
                    $code .= $this->addServiceMethodCalls(null, $sDefinition, $name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
                    $code .= $this->addServiceProperties(null, $sDefinition, $name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
                    $code .= $this->addServiceConfigurator(null, $sDefinition, $name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
                $code .= "\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
     * Adds the service return statement.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
     * @param string $id Service id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
    private function addServiceReturn($id, $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
        if ($this->isSimpleInstance($id, $definition)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
            return "    }\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
        return "\n        return \$instance;\n    }\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
     * Generates the service instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
     * @param string $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
     * @throws \InvalidArgumentException
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
     * @throws \RuntimeException
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
    private function addServiceInstance($id, $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
        $class = $this->dumpValue($definition->getClass());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
        if (0 === strpos($class, "'") && !preg_match('/^\'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
            throw new \InvalidArgumentException(sprintf('"%s" is not a valid class name for the "%s" service.', $class, $id));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
        $arguments = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
        foreach ($definition->getArguments() as $value) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
            $arguments[] = $this->dumpValue($value);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
        $simple = $this->isSimpleInstance($id, $definition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
        $instantiation = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
        if (ContainerInterface::SCOPE_CONTAINER === $definition->getScope()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
            $instantiation = "\$this->services['$id'] = ".($simple ? '' : '$instance');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
        } else if (ContainerInterface::SCOPE_PROTOTYPE !== $scope = $definition->getScope()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
            $instantiation = "\$this->services['$id'] = \$this->scopedServices['$scope']['$id'] = ".($simple ? '' : '$instance');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
        } elseif (!$simple) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
            $instantiation = '$instance';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
        $return = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
        if ($simple) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
            $return = 'return ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
            $instantiation .= ' = ';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
        if (null !== $definition->getFactoryMethod()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
            if (null !== $definition->getFactoryClass()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
                $code = sprintf("        $return{$instantiation}call_user_func(array(%s, '%s')%s);\n", $this->dumpValue($definition->getFactoryClass()), $definition->getFactoryMethod(), $arguments ? ', '.implode(', ', $arguments) : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
            } elseif (null !== $definition->getFactoryService()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
                $code = sprintf("        $return{$instantiation}%s->%s(%s);\n", $this->getServiceCall($definition->getFactoryService()), $definition->getFactoryMethod(), implode(', ', $arguments));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
                throw new \RuntimeException('Factory method requires a factory service or factory class in service definition for '.$id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
        } elseif (false !== strpos($class, '$')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
            $code = sprintf("        \$class = %s;\n        $return{$instantiation}new \$class(%s);\n", $class, implode(', ', $arguments));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
            $code = sprintf("        $return{$instantiation}new \\%s(%s);\n", substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
        if (!$simple) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
            $code .= "\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
     * Checks if the definition is a simple instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
     * @param string $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
     * @return Boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
    private function isSimpleInstance($id, $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
        foreach (array_merge(array($definition), $this->getInlinedDefinitions($definition)) as $sDefinition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
            if ($definition !== $sDefinition && !$this->hasReference($id, $sDefinition->getMethodCalls())) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
                continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
            if ($sDefinition->getMethodCalls() || $sDefinition->getProperties() || $sDefinition->getConfigurator()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
                return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
        return true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
     * Adds method calls to a service definition.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
     * @param string $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
     * @param string $variableName
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
    private function addServiceMethodCalls($id, $definition, $variableName = 'instance')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
        $calls = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
        foreach ($definition->getMethodCalls() as $call) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
            $arguments = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
            foreach ($call[1] as $value) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
                $arguments[] = $this->dumpValue($value);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
            $calls .= $this->wrapServiceConditionals($call[1], sprintf("        \$%s->%s(%s);\n", $variableName, $call[0], implode(', ', $arguments)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
        return $calls;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
    private function addServiceProperties($id, $definition, $variableName = 'instance')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
        $code = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
        foreach ($definition->getProperties() as $name => $value) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
            $code .= sprintf("        \$%s->%s = %s;\n", $variableName, $name, $this->dumpValue($value));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
     * Generates the inline definition setup.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
     * @param string $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
    private function addServiceInlinedDefinitionsSetup($id, $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
        $this->referenceVariables[$id] = new Variable('instance');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
        $code = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
        $processed = new \SplObjectStorage();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
        foreach ($this->getInlinedDefinitions($definition) as $iDefinition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
            if ($processed->contains($iDefinition)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
                continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
            $processed->offsetSet($iDefinition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
            if (!$this->hasReference($id, $iDefinition->getMethodCalls())) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
                continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
            if ($iDefinition->getMethodCalls()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
                $code .= $this->addServiceMethodCalls(null, $iDefinition, (string) $this->definitionVariables->offsetGet($iDefinition));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
            if ($iDefinition->getConfigurator()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
                $code .= $this->addServiceConfigurator(null, $iDefinition, (string) $this->definitionVariables->offsetGet($iDefinition));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
        if ('' !== $code) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
            $code .= "\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
     * Adds configurator definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
     * @param string $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
     * @param string $variableName
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
    private function addServiceConfigurator($id, $definition, $variableName = 'instance')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
        if (!$callable = $definition->getConfigurator()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
            return '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
        if (is_array($callable)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
            if (is_object($callable[0]) && $callable[0] instanceof Reference) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
                return sprintf("        %s->%s(\$%s);\n", $this->getServiceCall((string) $callable[0]), $callable[1], $variableName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
            return sprintf("        call_user_func(array(%s, '%s'), \$%s);\n", $this->dumpValue($callable[0]), $callable[1], $variableName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
        return sprintf("        %s(\$%s);\n", $callable, $variableName);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
     * Adds a service
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
     * @param string $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
    private function addService($id, $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
        $name = Container::camelize($id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
        $this->definitionVariables = new \SplObjectStorage();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
        $this->referenceVariables = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
        $this->variableCount = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
        $return = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
        if ($definition->isSynthetic()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
            $return = sprintf('@throws \RuntimeException always since this service is expected to be injected dynamically');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
        } elseif ($class = $definition->getClass()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
            $return = sprintf("@return %s A %s instance.", 0 === strpos($class, '%') ? 'Object' : $class, $class);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
        } elseif ($definition->getFactoryClass()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
            $return = sprintf('@return Object An instance returned by %s::%s().', $definition->getFactoryClass(), $definition->getFactoryMethod());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
        } elseif ($definition->getFactoryService()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
            $return = sprintf('@return Object An instance returned by %s::%s().', $definition->getFactoryService(), $definition->getFactoryMethod());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
        $doc = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
        if (ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
            $doc .= <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
     * This service is shared.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
     * This method always returns the same instance of the service.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
        if (!$definition->isPublic()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
            $doc .= <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
     * This service is private.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
     * If you want to be able to request this service from the container directly,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
     * make it public, otherwise you might end up with broken code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
        $code = <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
     * Gets the '$id' service.$doc
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
     * $return
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
    protected function get{$name}Service()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
        $scope = $definition->getScope();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
        if (ContainerInterface::SCOPE_CONTAINER !== $scope && ContainerInterface::SCOPE_PROTOTYPE !== $scope) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
            $code .= <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
        if (!isset(\$this->scopedServices['$scope'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
            throw new InactiveScopeException('$id', '$scope');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
        if ($definition->isSynthetic()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
            $code .= sprintf("        throw new \RuntimeException('You have requested a synthetic service (\"%s\"). The DIC does not know how to construct this service.');\n    }\n", $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
            $code .=
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
                $this->addServiceInclude($id, $definition).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
                $this->addServiceLocalTempVariables($id, $definition).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
                $this->addServiceInlinedDefinitions($id, $definition).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
                $this->addServiceInstance($id, $definition).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
                $this->addServiceInlinedDefinitionsSetup($id, $definition).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
                $this->addServiceMethodCalls($id, $definition).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
                $this->addServiceProperties($id, $definition).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
                $this->addServiceConfigurator($id, $definition).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
                $this->addServiceReturn($id, $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
            ;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
        $this->definitionVariables = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
        $this->referenceVariables = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
     * Adds a service alias.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
     * @param string $alias
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
     * @param string $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
    private function addServiceAlias($alias, $id)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
        $name = Container::camelize($alias);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
        $type = 'Object';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
        if ($this->container->hasDefinition($id)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
            $class = $this->container->getDefinition($id)->getClass();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
            $type = 0 === strpos($class, '%') ? 'Object' : $class;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
        return <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
     * Gets the $alias service alias.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
     * @return $type An instance of the $id service
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
    protected function get{$name}Service()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
        return {$this->getServiceCall($id)};
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
     * Adds multiple services
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
    private function addServices()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
        $publicServices = $privateServices = $aliasServices = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
        $definitions = $this->container->getDefinitions();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
        ksort($definitions);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
        foreach ($definitions as $id => $definition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
            if ($definition->isPublic()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
                $publicServices .= $this->addService($id, $definition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
                $privateServices .= $this->addService($id, $definition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
        $aliases = $this->container->getAliases();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
        ksort($aliases);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
        foreach ($aliases as $alias => $id) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
            $aliasServices .= $this->addServiceAlias($alias, $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
        return $publicServices.$aliasServices.$privateServices;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
     * Adds the class headers.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
     * @param string $class Class name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
     * @param string $baseClass The name of the base class
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
    private function startClass($class, $baseClass)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
        $bagClass = $this->container->isFrozen() ? 'use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag;' : 'use Symfony\Component\DependencyInjection\ParameterBag\\ParameterBag;';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
        return <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
use Symfony\Component\DependencyInjection\ContainerInterface;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
use Symfony\Component\DependencyInjection\Container;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
use Symfony\Component\DependencyInjection\Reference;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
use Symfony\Component\DependencyInjection\Parameter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
$bagClass
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
 * $class
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
 * This class has been auto-generated
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
 * by the Symfony Dependency Injection Component.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
class $class extends $baseClass
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
     * Adds the constructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
    private function addConstructor()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
        $code = <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
     * Constructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
    public function __construct()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
        parent::__construct(new ParameterBag(\$this->getDefaultParameters()));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
        if (count($scopes = $this->container->getScopes()) > 0) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
            $code .= "\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
            $code .= "        \$this->scopes = ".$this->dumpValue($scopes).";\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
            $code .= "        \$this->scopeChildren = ".$this->dumpValue($this->container->getScopeChildren()).";\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
        $code .= <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
     * Adds the constructor for a frozen container.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
    private function addFrozenConstructor()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
        $code = <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
     * Constructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
    public function __construct()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
        \$this->parameters = \$this->getDefaultParameters();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
        \$this->services =
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
        \$this->scopedServices =
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
        \$this->scopeStacks = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
        \$this->set('service_container', \$this);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
        $code .= "\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
        if (count($scopes = $this->container->getScopes()) > 0) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
            $code .= "        \$this->scopes = ".$this->dumpValue($scopes).";\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
            $code .= "        \$this->scopeChildren = ".$this->dumpValue($this->container->getScopeChildren()).";\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
            $code .= "        \$this->scopes = array();\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
            $code .= "        \$this->scopeChildren = array();\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
        $code .= <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
     * Adds default parameters method.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
    private function addDefaultParametersMethod()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
        if (!$this->container->getParameterBag()->all()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
            return '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
        $parameters = $this->exportParameters($this->container->getParameterBag()->all());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
        $code = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
        if ($this->container->isFrozen()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
            $code .= <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
    public function getParameter(\$name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
        \$name = strtolower(\$name);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
        if (!array_key_exists(\$name, \$this->parameters)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
            throw new \InvalidArgumentException(sprintf('The parameter "%s" must be defined.', \$name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
        return \$this->parameters[\$name];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
    public function hasParameter(\$name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
        return array_key_exists(strtolower(\$name), \$this->parameters);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
     * {@inheritdoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
    public function setParameter(\$name, \$value)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
        throw new \LogicException('Impossible to call set() on a frozen ParameterBag.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
     * {@inheritDoc}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
    public function getParameterBag()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
        if (null === \$this->parameterBag) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
            \$this->parameterBag = new FrozenParameterBag(\$this->parameters);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
        return \$this->parameterBag;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
        $code .= <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
     * Gets the default parameters.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
     * @return array An array of the default parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
    protected function getDefaultParameters()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
        return $parameters;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
        return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
     * Exports parameters.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
     * @param array $parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
     * @param string $path
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
     * @param integer $indent
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
    private function exportParameters($parameters, $path = '', $indent = 12)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
        $php = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
        foreach ($parameters as $key => $value) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
            if (is_array($value)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
                $value = $this->exportParameters($value, $path.'/'.$key, $indent + 4);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
            } elseif ($value instanceof Variable) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
                throw new \InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain variable references. Variable "%s" found in "%s".', $value, $path.'/'.$key));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
            } elseif ($value instanceof Definition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
                throw new \InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain service definitions. Definition for "%s" found in "%s".', $value->getClass(), $path.'/'.$key));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
            } elseif ($value instanceof Reference) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
                throw new \InvalidArgumentException(sprintf('You cannot dump a container with parameters that contain references to other services (reference to service "%s" found in "%s").', $value, $path.'/'.$key));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
                $value = var_export($value, true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
            $php[] = sprintf('%s%s => %s,', str_repeat(' ', $indent), var_export($key, true), $value);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
        return sprintf("array(\n%s\n%s)", implode("\n", $php), str_repeat(' ', $indent - 4));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
     * Ends the class definition.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
    private function endClass()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
        return <<<EOF
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
}
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
EOF;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
     * Wraps the service conditionals.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
     * @param string $value
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
     * @param string $code
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
    private function wrapServiceConditionals($value, $code)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
        if (!$services = ContainerBuilder::getServiceConditionals($value)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
            return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
        $conditions = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
        foreach ($services as $service) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
            $conditions[] = sprintf("\$this->has('%s')", $service);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
        // re-indent the wrapped code
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
        $code = implode("\n", array_map(function ($line) { return $line ? '    '.$line : $line; }, explode("\n", $code)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
        return sprintf("        if (%s) {\n%s        }\n", implode(' && ', $conditions), $code);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
     * Builds service calls from arguments
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
     * @param array  $arguments
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
     * @param string $calls    By reference
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
     * @param string $behavior By reference
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
     * @return void
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
    private function getServiceCallsFromArguments(array $arguments, array &$calls, array &$behavior)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
        foreach ($arguments as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
            if (is_array($argument)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
                $this->getServiceCallsFromArguments($argument, $calls, $behavior);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
            } else if ($argument instanceof Reference) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
                $id = (string) $argument;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
                if (!isset($calls[$id])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
                    $calls[$id] = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
                if (!isset($behavior[$id])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
                    $behavior[$id] = $argument->getInvalidBehavior();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
                } else if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $behavior[$id]) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
                    $behavior[$id] = $argument->getInvalidBehavior();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
                $calls[$id] += 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
     * Returns the inline definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
     * @param Definition $definition
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
     * @return array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
    private function getInlinedDefinitions(Definition $definition)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
        if (false === $this->inlinedDefinitions->contains($definition)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
            $definitions = array_merge(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
                $this->getDefinitionsFromArguments($definition->getArguments()),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
                $this->getDefinitionsFromArguments($definition->getMethodCalls()),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
                $this->getDefinitionsFromArguments($definition->getProperties())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
            );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
            $this->inlinedDefinitions->offsetSet($definition, $definitions);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
            return $definitions;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
        return $this->inlinedDefinitions->offsetGet($definition);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
     * Gets the definition from arguments
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
     * @param array $arguments
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
     * @return array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
    private function getDefinitionsFromArguments(array $arguments)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
        $definitions = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
        foreach ($arguments as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
            if (is_array($argument)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
                $definitions = array_merge($definitions, $this->getDefinitionsFromArguments($argument));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
            } else if ($argument instanceof Definition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
                $definitions = array_merge(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
                    $definitions,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
                    $this->getInlinedDefinitions($argument),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
                    array($argument)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
                );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
        return $definitions;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
     * Checks if a service id has a reference
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
     * @param string $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
     * @param array $arguments
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
     * @return Boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
    private function hasReference($id, array $arguments)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
        foreach ($arguments as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
            if (is_array($argument)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
                if ($this->hasReference($id, $argument)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
                    return true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
            } else if ($argument instanceof Reference) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
                if ($id === (string) $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
                    return true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
        return false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
     * Dumps values.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
     * @param array $value
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
     * @param Boolean $interpolate
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
    private function dumpValue($value, $interpolate = true)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
        if (is_array($value)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
            $code = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
            foreach ($value as $k => $v) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
                $code[] = sprintf('%s => %s', $this->dumpValue($k, $interpolate), $this->dumpValue($v, $interpolate));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
            return sprintf('array(%s)', implode(', ', $code));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
        } elseif (is_object($value) && $value instanceof Definition) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
            if (null !== $this->definitionVariables && $this->definitionVariables->contains($value)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
                return $this->dumpValue($this->definitionVariables->offsetGet($value), $interpolate);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
            if (count($value->getMethodCalls()) > 0) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
                throw new \RuntimeException('Cannot dump definitions which have method calls.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
            if (null !== $value->getConfigurator()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
                throw new \RuntimeException('Cannot dump definitions which have a configurator.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
            $arguments = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
            foreach ($value->getArguments() as $argument) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
                $arguments[] = $this->dumpValue($argument);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
            $class = $this->dumpValue($value->getClass());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
            if (false !== strpos($class, '$')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
                throw new \RuntimeException('Cannot dump definitions which have a variable class name.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
            if (null !== $value->getFactoryMethod()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
                if (null !== $value->getFactoryClass()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
                    return sprintf("call_user_func(array(%s, '%s')%s)", $this->dumpValue($value->getFactoryClass()), $value->getFactoryMethod(), count($arguments) > 0 ? ', '.implode(', ', $arguments) : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
                } elseif (null !== $value->getFactoryService()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
                    return sprintf("%s->%s(%s)", $this->getServiceCall($value->getFactoryService()), $value->getFactoryMethod(), implode(', ', $arguments));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
                } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
                    throw new \RuntimeException('Cannot dump definitions which have factory method without factory service or factory class.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
            return sprintf("new \\%s(%s)", substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
        } elseif (is_object($value) && $value instanceof Variable) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
            return '$'.$value;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
        } elseif (is_object($value) && $value instanceof Reference) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
            if (null !== $this->referenceVariables && isset($this->referenceVariables[$id = (string) $value])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
                return $this->dumpValue($this->referenceVariables[$id], $interpolate);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
            return $this->getServiceCall((string) $value, $value);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
        } elseif (is_object($value) && $value instanceof Parameter) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
            return $this->dumpParameter($value);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
        } elseif (true === $interpolate && is_string($value)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
            if (preg_match('/^%([^%]+)%$/', $value, $match)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
                // we do this to deal with non string values (Boolean, integer, ...)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
                // the preg_replace_callback converts them to strings
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
                return $this->dumpParameter(strtolower($match[1]));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
                $that = $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
                $replaceParameters = function ($match) use ($that)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
                {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
                    return "'.".$that->dumpParameter(strtolower($match[2])).".'";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
                };
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
                $code = str_replace('%%', '%', preg_replace_callback('/(?<!%)(%)([^%]+)\1/', $replaceParameters, var_export($value, true)));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
                // optimize string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
                $code = preg_replace(array("/^''\./", "/\.''$/", "/'\.'/", "/\.''\./"), array('', '', '', '.'), $code);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
                return $code;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
        } elseif (is_object($value) || is_resource($value)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
            throw new \RuntimeException('Unable to dump a service container if a parameter is an object or a resource.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
            return var_export($value, true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
     * Dumps a parameter
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
     * @param string $name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
    public function dumpParameter($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
        if ($this->container->isFrozen() && $this->container->hasParameter($name)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
            return $this->dumpValue($this->container->getParameter($name), false);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
        return sprintf("\$this->getParameter('%s')", strtolower($name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
     * Gets a service call
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
     * @param string    $id
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
     * @param Reference $reference
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
    private function getServiceCall($id, Reference $reference = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
        if ('service_container' === $id) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
            return '$this';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
        if (null !== $reference && ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE !== $reference->getInvalidBehavior()) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
            return sprintf('$this->get(\'%s\', ContainerInterface::NULL_ON_INVALID_REFERENCE)', $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
            if ($this->container->hasAlias($id)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
                $id = (string) $this->container->getAlias($id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
            return sprintf('$this->get(\'%s\')', $id);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
     * Returns the next name to use
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
    private function getNextVariableName()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
        $firstChars = self::FIRST_CHARS;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
        $firstCharsLength = strlen($firstChars);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
        $nonFirstChars = self::NON_FIRST_CHARS;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
        $nonFirstCharsLength = strlen($nonFirstChars);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
        while (true) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
            $name = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
            $i = $this->variableCount;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
            if ('' === $name) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
                $name .= $firstChars[$i%$firstCharsLength];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
                $i = intval($i/$firstCharsLength);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
            while ($i > 0) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
                $i -= 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
                $name .= $nonFirstChars[$i%$nonFirstCharsLength];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
                $i = intval($i/$nonFirstCharsLength);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
            $this->variableCount += 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
            // check that the name is not reserved
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
            if (in_array($name, $this->reservedVariables, true)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
                continue;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
            return $name;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
}