From 8cdf38799058370a368fd19a3a5963472f86f55f Mon Sep 17 00:00:00 2001 From: Thomas Ploch Date: Fri, 8 Mar 2013 16:38:09 +0100 Subject: [PATCH] [DependencyInjection] Added '@@' escaping strategy for YamlFileLoader and YamlDumper Added the possibility to to use '@@' as an escaping strategy for parameters that should be treated as strings but start with '@' (i.e. safe mailer passwords). --- .../Component/DependencyInjection/Dumper/YamlDumper.php | 2 +- .../DependencyInjection/Loader/YamlFileLoader.php | 9 +++++++-- .../Tests/Fixtures/containers/container8.php | 1 + .../DependencyInjection/Tests/Fixtures/php/services8.php | 1 + .../DependencyInjection/Tests/Fixtures/xml/services8.xml | 1 + .../Tests/Fixtures/yaml/services2.yml | 1 + .../Tests/Fixtures/yaml/services8.yml | 1 + .../Tests/Loader/YamlFileLoaderTest.php | 4 ++-- 8 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php index e4e168257e4e6..0574df455e4ab 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php @@ -260,7 +260,7 @@ private function prepareParameters($parameters, $escape = true) foreach ($parameters as $key => $value) { if (is_array($value)) { $value = $this->prepareParameters($value, $escape); - } elseif ($value instanceof Reference) { + } elseif ($value instanceof Reference || is_string($value) && 0 === strpos($value, '@')) { $value = '@'.$value; } diff --git a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php index 71de4ac6592f6..05215cdb6b9ab 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php @@ -290,7 +290,10 @@ private function resolveServices($value) if (is_array($value)) { $value = array_map(array($this, 'resolveServices'), $value); } elseif (is_string($value) && 0 === strpos($value, '@')) { - if (0 === strpos($value, '@?')) { + if (0 === strpos($value, '@@')) { + $value = substr($value, 1); + $invalidBehavior = null; + } elseif (0 === strpos($value, '@?')) { $value = substr($value, 2); $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; } else { @@ -305,7 +308,9 @@ private function resolveServices($value) $strict = true; } - $value = new Reference($value, $invalidBehavior, $strict); + if (null !== $invalidBehavior) { + $value = new Reference($value, $invalidBehavior, $strict); + } } return $value; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php index 28c65369c22ee..eec856412b09c 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php @@ -7,6 +7,7 @@ 'FOO' => '%baz%', 'baz' => 'bar', 'bar' => 'foo is %%foo bar', + 'escape' => '@escapeme', 'values' => array(true, false, null, 0, 1000.3, 'true', 'false', 'null'), ))); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php index 77e4183a7cfc0..77712e8297d17 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php @@ -37,6 +37,7 @@ protected function getDefaultParameters() 'foo' => '%baz%', 'baz' => 'bar', 'bar' => 'foo is %%foo bar', + 'escape' => '@escapeme', 'values' => array( 0 => true, 1 => false, diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml index f11d6069defd8..c5fa5fb52d151 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml @@ -7,6 +7,7 @@ %baz% bar foo is %%foo bar + @escapeme true false diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml index 8ddfe0d421179..3c127466af80a 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services2.yml @@ -6,6 +6,7 @@ parameters: - 0 - 1000.3 bar: foo + escape: @@escapeme foo_bar: @foo_bar MixedCase: MixedCaseKey: value diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml index 5e747486cb250..a1fb59035855e 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml @@ -2,5 +2,6 @@ parameters: foo: '%baz%' baz: bar bar: 'foo is %%foo bar' + escape: '@@escapeme' values: [true, false, null, 0, 1000.3, 'true', 'false', 'null'] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php index e655d3bd8981a..39cfce52f3d62 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php @@ -84,7 +84,7 @@ public function testLoadParameters() $container = new ContainerBuilder(); $loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml')); $loader->load('services2.yml'); - $this->assertEquals(array('foo' => 'bar', 'mixedcase' => array('MixedCaseKey' => 'value'), 'values' => array(true, false, 0, 1000.3), 'bar' => 'foo', 'foo_bar' => new Reference('foo_bar')), $container->getParameterBag()->all(), '->load() converts YAML keys to lowercase'); + $this->assertEquals(array('foo' => 'bar', 'mixedcase' => array('MixedCaseKey' => 'value'), 'values' => array(true, false, 0, 1000.3), 'bar' => 'foo', 'escape' => '@escapeme', 'foo_bar' => new Reference('foo_bar')), $container->getParameterBag()->all(), '->load() converts YAML keys to lowercase'); } public function testLoadImports() @@ -99,7 +99,7 @@ public function testLoadImports() $loader->load('services4.yml'); $actual = $container->getParameterBag()->all(); - $expected = array('foo' => 'bar', 'values' => array(true, false), 'bar' => '%foo%', 'foo_bar' => new Reference('foo_bar'), 'mixedcase' => array('MixedCaseKey' => 'value'), 'imported_from_ini' => true, 'imported_from_xml' => true); + $expected = array('foo' => 'bar', 'values' => array(true, false), 'bar' => '%foo%', 'escape' => '@escapeme', 'foo_bar' => new Reference('foo_bar'), 'mixedcase' => array('MixedCaseKey' => 'value'), 'imported_from_ini' => true, 'imported_from_xml' => true); $this->assertEquals(array_keys($expected), array_keys($actual), '->load() imports and merges imported files'); // Bad import throws no exception due to ignore_errors value.