8000 [DependencyInjection] Fixed unescaping of class arguments · mageekguy/symfony@19bdae1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 19bdae1

Browse files
author
avorobiev
committed
[DependencyInjection] Fixed unescaping of class arguments
1 parent 81fe2ff commit 19bdae1

File tree

5 files changed

+27
-11
lines changed

5 files changed

+27
-11
lines changed

src/Symfony/Component/DependencyInjection/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@ CHANGELOG
1010
* added Definition::clearTag()
1111
* component exceptions that inherit base SPL classes are now used exclusively
1212
(this includes dumped containers)
13+
* [BC BREAK] fixed unescaping of class arguments, method ParameterBag::unescapeValue() was made
14+
public
15+

src/Symfony/Component/DependencyInjection/ContainerBuilder.php

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -728,24 +728,28 @@ public function findDefinition($id)
728728
*/
729729
private function createService(Definition $definition, $id)
730730
{
731+
$parameterBag = $this->getParameterBag();
732+
731733
if (null !== $definition->getFile()) {
732-
require_once $this->getParameterBag()->resolveValue($definition->getFile());
734+
require_once $parameterBag->resolveValue($definition->getFile());
733735
}
734736

735-
$arguments = $this->resolveServices($this->getParameterBag()->resolveValue($definition->getArguments()));
737+
$arguments = $this->resolveServices(
738+
$parameterBag->unescapeValue($parameterBag->resolveValue($definition->getArguments()))
739+
);
736740

737741
if (null !== $definition->getFactoryMethod()) {
738742
if (null !== $definition->getFactoryClass()) {
739-
$factory = $this->getParameterBag()->resolveValue($definition->getFactoryClass());
743+
$factory = $parameterBag->resolveValue($definition->getFactoryClass());
740744
} elseif (null !== $definition->getFactoryService()) {
741-
$factory = $this->get($this->getParameterBag()->resolveValue($definition->getFactoryService()));
745+
$factory = $this->get($parameterBag->resolveValue($definition->getFactoryService()));
742746
} else {
743747
throw new RuntimeException('Cannot create service from factory method without a factory service or factory class.');
744748
}
745749

746750
$service = call_user_func_array(array($factory, $definition->getFactoryMethod()), $arguments);
747751
} else {
748-
$r = new \ReflectionClass($this->getParameterBag()->resolveValue($definition->getClass()));
752+
$r = new \ReflectionClass($parameterBag->resolveValue($definition->getClass()));
749753

750754
$service = null === $r->getConstructor() ? $r->newInstance() : $r->newInstanceArgs($arguments);
751755
}
@@ -774,11 +778,11 @@ private function createService(Definition $definition, $id)
774778
}
775779

776780
if ($ok) {
777-
call_user_func_array(array($service, $call[0]), $this->resolveServices($this->getParameterBag()->resolveValue($call[1])));
781+
call_user_func_array(array($service, $call[0]), $this->resolveServices($parameterBag->resolveValue($call[1])));
778782
}
779783
}
780784

781-
$properties = $this->resolveServices($this->getParameterBag()->resolveValue($definition->getProperties()));
785+
$properties = $this->resolveServices($parameterBag->resolveValue($definition->getProperties()));
782786
foreach ($properties as $name => $value) {
783787
$service->$name = $value;
784788
}
@@ -787,7 +791,7 @@ private function createService(Definition $definition, $id)
787791
if (is_array($callable) && is_object($callable[0]) && $callable[0] instanceof Reference) {
788792
$callable[0] = $this->get((string) $callable[0]);
789793
} elseif (is_array($callable)) {
790-
$callable[0] = $this->getParameterBag()->resolveValue($callable[0]);
794+
$callable[0] = $parameterBag->resolveValue($callable[0]);
791795
}
792796

793797
if (!is_callable($callable)) {

src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ public function escapeValue($value)
274274
return $value;
275275
}
276276

277-
private function unescapeValue($value)
277+
public function unescapeValue($value)
278278
{
279279
if (is_string($value)) {
280280
return str_replace('%%', '%', $value);

src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBagInterface.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,13 @@ function resolveValue($value);
103103
* @return mixed
104104
*/
105105
function escapeValue($value);
106+
107+
/**
108+
* Unescape parameter placeholders %
109+
*
110+
* @param mixed $value
111+
*
112+
* @return mixed
113+
*/
114+
function unescapeValue($value);
106115
}

src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,9 @@ public function testCreateServiceArguments()
251251
{
252252
$builder = new ContainerBuilder();
253253
$builder->register('bar', 'stdClass');
254-
$builder->register('foo1', 'FooClass')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar')));
254+
$builder->register('foo1', 'FooClass')->addArgument(array('foo' => '%value%', ' 6152 %value%' => 'foo', new Reference('bar'), '%%unescape_it%%'));
255255
$builder->setParameter('value', 'bar');
256-
$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');
256+
$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');
257257
}
258258

259259
/**

0 commit comments

Comments
 (0)
0