Browse Source

adds helper method to normalize keys

Johannes Schmitt 14 years ago
parent
commit
40dec8831f

+ 66 - 0
src/Symfony/Component/DependencyInjection/Extension/Extension.php

@@ -37,4 +37,70 @@ abstract class Extension implements ExtensionInterface
 
         $this->$method($config, $configuration);
     }
+
+    /**
+     * This method normalizes keys between the different configuration formats
+     *
+     * Namely, you mostly have foo_bar in YAML while you have foo-bar in XML.
+     * After running this method, all keys are normalized to foo_bar.
+     *
+     * If you have a mixed key like foo-bar_moo, it will not be altered.
+     * The key will also not be altered if the target key already exists.
+     *
+     * @param array $config
+     *
+     * @return array the config with normalized keys
+     */
+    public static function normalizeKeys(array $config)
+    {
+        foreach ($config as $key => $value) {
+            if (is_array($value)) {
+                $config[$key] = self::normalizeKeys($value);
+            }
+
+            if (false !== strpos($key, '-') && false === strpos($key, '_') && !array_key_exists($normalizedKey = str_replace('-', '_', $key), $config)) {
+                $config[$normalizedKey] = $config[$key];
+                unset($config[$key]);
+            }
+        }
+
+        return $config;
+    }
+
+    /**
+     * Normalizes a configuration entry.
+     *
+     * This method returns a normalize configuration array for a given key
+     * to remove the differences due to the original format (YAML and XML mainly).
+     *
+     * Here is an example.
+     *
+     * The configuration is XML:
+     *
+     * <twig:extension id="twig.extension.foo" />
+     * <twig:extension id="twig.extension.bar" />
+     *
+     * And the same configuration in YAML:
+     *
+     * twig.extensions: ['twig.extension.foo', 'twig.extension.bar']
+     *
+     * @param array A config array
+     * @param key   The key to normalize
+     */
+    public static function normalizeConfig($config, $key)
+    {
+        $values = array();
+        if (isset($config[$key.'s'])) {
+            $values = $config[$key.'s'];
+        } elseif (isset($config[$key])) {
+            if (is_string($config[$key]) || !is_int(key($config[$key]))) {
+                // only one
+                $values = array($config[$key]);
+            } else {
+                $values = $config[$key];
+            }
+        }
+
+        return $values;
+    }
 }

+ 0 - 37
src/Symfony/Component/HttpKernel/DependencyInjection/Extension.php

@@ -37,41 +37,4 @@ abstract class Extension extends BaseExtension
     {
         $this->classes = array_merge($this->classes, $classes);
     }
-
-    /**
-     * Normalizes a configuration entry.
-     *
-     * This method returns a normalize configuration array for a given key
-     * to remove the differences due to the original format (YAML and XML mainly).
-     *
-     * Here is an example.
-     *
-     * The configuration is XML:
-     *
-     * <twig:extension id="twig.extension.foo" />
-     * <twig:extension id="twig.extension.bar" />
-     *
-     * And the same configuration in YAML:
-     *
-     * twig.extensions: ['twig.extension.foo', 'twig.extension.bar']
-     *
-     * @param array A config array
-     * @param key   The key to normalize
-     */
-    public static function normalizeConfig($config, $key)
-    {
-        $values = array();
-        if (isset($config[$key.'s'])) {
-            $values = $config[$key.'s'];
-        } elseif (isset($config[$key])) {
-            if (is_string($config[$key]) || !is_int(key($config[$key]))) {
-                // only one
-                $values = array($config[$key]);
-            } else {
-                $values = $config[$key];
-            }
-        }
-
-        return $values;
-    }
 }

+ 36 - 0
tests/Symfony/Tests/Component/DependencyInjection/Extension/ExtensionTest.php

@@ -11,6 +11,8 @@
 
 namespace Symfony\Tests\Component\DependencyInjection\Extension;
 
+use Symfony\Component\DependencyInjection\Extension\Extension;
+
 require_once __DIR__.'/../Fixtures/includes/ProjectExtension.php';
 
 use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -35,4 +37,38 @@ class ExtensionTest extends \PHPUnit_Framework_TestCase
         $extension->load('bar', array('foo' => 'bar'), $config = new ContainerBuilder());
         $this->assertEquals(array('project.parameter.bar' => 'bar', 'project.parameter.foo' => 'bar'), $config->getParameterBag()->all(), '->load() calls the method tied to the given tag');
     }
+
+    /**
+     * @dataProvider getKeyNormalizationTests
+     */
+    public function testNormalizeKeys($denormalized, $normalized)
+    {
+        $this->assertSame($normalized, Extension::normalizeKeys($denormalized));
+    }
+
+    public function getKeyNormalizationTests()
+    {
+        return array(
+            array(
+                array('foo-bar' => 'foo'),
+                array('foo_bar' => 'foo'),
+            ),
+            array(
+                array('foo-bar_moo' => 'foo'),
+                array('foo-bar_moo' => 'foo'),
+            ),
+            array(
+                array('foo-bar' => null, 'foo_bar' => 'foo'),
+                array('foo-bar' => null, 'foo_bar' => 'foo'),
+            ),
+            array(
+                array('foo-bar' => array('foo-bar' => 'foo')),
+                array('foo_bar' => array('foo_bar' => 'foo')),
+            ),
+            array(
+                array('foo_bar' => array('foo-bar' => 'foo')),
+                array('foo_bar' => array('foo_bar' => 'foo')),
+            )
+        );
+    }
 }