diff --git a/src/Symfony/Component/DependencyInjection/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md index 96839e9660..d12f23674c 100644 --- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md +++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md @@ -10,3 +10,6 @@ CHANGELOG * added Definition::clearTag() * component exceptions that inherit base SPL classes are now used exclusively (this includes dumped containers) + * [BC BREAK] fixed unescaping of class arguments, method ParameterBag::unescapeValue() was made + public + diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index a706229db4..223ceead35 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -728,24 +728,28 @@ class ContainerBuilder extends Container implements TaggedContainerInterface */ private function createService(Definition $definition, $id) { + $parameterBag = $this->getParameterBag(); + if (null !== $definition->getFile()) { - require_once $this->getParameterBag()->resolveValue($definition->getFile()); + require_once $parameterBag->resolveValue($definition->getFile()); } - $arguments = $this->resolveServices($this->getParameterBag()->resolveValue($definition->getArguments())); + $arguments = $this->resolveServices( + $parameterBag->unescapeValue($parameterBag->resolveValue($definition->getArguments())) + ); if (null !== $definition->getFactoryMethod()) { if (null !== $definition->getFactoryClass()) { - $factory = $this->getParameterBag()->resolveValue($definition->getFactoryClass()); + $factory = $parameterBag->resolveValue($definition->getFactoryClass()); } elseif (null !== $definition->getFactoryService()) { - $factory = $this->get($this->getParameterBag()->resolveValue($definition->getFactoryService())); + $factory = $this->get($parameterBag->resolveValue($definition->getFactoryService())); } else { throw new RuntimeException('Cannot create service from factory method without a factory service or factory class.'); } $service = call_user_func_array(array($factory, $definition->getFactoryMethod()), $arguments); } else { - $r = new \ReflectionClass($this->getParameterBag()->resolveValue($definition->getClass())); + $r = new \ReflectionClass($parameterBag->resolveValue($definition->getClass())); $service = null === $r->getConstructor() ? $r->newInstance() : $r->newInstanceArgs($arguments); } @@ -774,11 +778,11 @@ class ContainerBuilder extends Container implements TaggedContainerInterface } if ($ok) { - call_user_func_array(array($service, $call[0]), $this->resolveServices($this->getParameterBag()->resolveValue($call[1]))); + call_user_func_array(array($service, $call[0]), $this->resolveServices($parameterBag->resolveValue($call[1]))); } } - $properties = $this->resolveServices($this->getParameterBag()->resolveValue($definition->getProperties())); + $properties = $this->resolveServices($parameterBag->resolveValue($definition->getProperties())); foreach ($properties as $name => $value) { $service->$name = $value; } @@ -787,7 +791,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface if (is_array($callable) && is_object($callable[0]) && $callable[0] instanceof Reference) { $callable[0] = $this->get((string) $callable[0]); } elseif (is_array($callable)) { - $callable[0] = $this->getParameterBag()->resolveValue($callable[0]); + $callable[0] = $parameterBag->resolveValue($callable[0]); } if (!is_callable($callable)) { diff --git a/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php b/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php index ad8dc489a4..908e2a146f 100644 --- a/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php +++ b/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php @@ -274,7 +274,7 @@ class ParameterBag implements ParameterBagInterface return $value; } - private function unescapeValue($value) + public function unescapeValue($value) { if (is_string($value)) { return str_replace('%%', '%', $value); diff --git a/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php b/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php index 4ad6aed2c8..a9a4f02261 100644 --- a/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php +++ b/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php @@ -103,4 +103,13 @@ interface ParameterBagInterface * @return mixed */ function escapeValue($value); + + /** + * Unescape parameter placeholders % + * + * @param mixed $value + * + * @return mixed + */ + function unescapeValue($value); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php index bedcecb7fc..4d650f9b87 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php @@ -251,9 +251,9 @@ class ContainerBuilderTest extends \PHPUnit_Framework_TestCase { $builder = new ContainerBuilder(); $builder->register('bar', 'stdClass'); - $builder->register('foo1', 'FooClass')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar'))); + $builder->register('foo1', 'FooClass')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar'), '%%unescape_it%%')); $builder->setParameter('value', 'bar'); - $this->assertEquals(array('foo' => 'bar', 'bar' => 'foo', $builder->get('bar')), $builder->get('foo1')->arguments, '->createService() replaces parameters and service references in the arguments provided by the service definition'); + $this->assertEquals(array('foo' => 'bar', 'bar' => 'foo', $builder->get('bar'), '%unescape_it%'), $builder->get('foo1')->arguments, '->createService() replaces parameters and service references in the arguments provided by the service definition'); } /**