Fabien Potencier 14 년 전
부모
커밋
8716c2ad1e

+ 1 - 2
src/Symfony/Component/Config/Definition/ArrayNode.php

@@ -15,7 +15,6 @@ use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
 use Symfony\Component\Config\Definition\Exception\DuplicateKeyException;
 use Symfony\Component\Config\Definition\Exception\InvalidTypeException;
 use Symfony\Component\Config\Definition\Exception\UnsetKeyException;
-use Symfony\Component\DependencyInjection\Extension\Extension;
 
 /**
  * Represents an ARRAY node in the config tree.
@@ -374,7 +373,7 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface
                 continue;
             }
 
-            $value[$plural] = Extension::normalizeConfig($value, $singular, $plural);
+            $value[$plural] = Processor::normalizeConfig($value, $singular, $plural);
             unset($value[$singular]);
         }
 

+ 1 - 1
src/Symfony/Component/Config/Definition/Builder/NodeBuilder.php

@@ -113,7 +113,7 @@ class NodeBuilder
      *         ->node('baz', 'scalar')
      *     ;
      *
-     * @return Symfony\Component\DependencyInjection\Configuration\Builder\NodeBuilder This builder node
+     * @return Symfony\Component\Config\Definition\Builder\NodeBuilder This builder node
      */
     public function builder(NodeBuilder $node)
     {

+ 74 - 3
src/Symfony/Component/Config/Definition/Processor.php

@@ -11,8 +11,6 @@
 
 namespace Symfony\Component\Config\Definition;
 
-use Symfony\Component\DependencyInjection\Extension\Extension;
-
 /**
  * This class is the entry point for config normalization/merging/finalization.
  *
@@ -29,7 +27,7 @@ class Processor
      */
     public function process(NodeInterface $configTree, array $configs)
     {
-        $configs = Extension::normalizeKeys($configs);
+        $configs = self::normalizeKeys($configs);
 
         $currentConfig = array();
         foreach ($configs as $config) {
@@ -39,4 +37,77 @@ class Processor
 
         return $configTree->finalize($currentConfig);
     }
+
+    /**
+     * 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  $config A config array
+     * @param string $key    The key to normalize
+     * @param string $plural The plural form of the key if it is irregular
+     *
+     * @return array
+     */
+    public static function normalizeConfig($config, $key, $plural = null)
+    {
+        if (null === $plural) {
+            $plural = $key.'s';
+        }
+
+        $values = array();
+        if (isset($config[$plural])) {
+            $values = $config[$plural];
+        } 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;
+    }
 }

+ 2 - 2
src/Symfony/Component/HttpKernel/DependencyInjection/Extension.php

@@ -2,7 +2,7 @@
 
 namespace Symfony\Component\HttpKernel\DependencyInjection;
 
-use Symfony\Component\DependencyInjection\Extension\Extension as BaseExtension;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Container;
 
@@ -20,7 +20,7 @@ use Symfony\Component\DependencyInjection\Container;
  *
  * @author Fabien Potencier <fabien@symfony.com>
  */
-abstract class Extension extends BaseExtension
+abstract class Extension implements ExtensionInterface
 {
     protected $classes = array();
     protected $classMap = array();

+ 4 - 8
tests/Symfony/Tests/Component/DependencyInjection/Extension/ExtensionTest.php

@@ -9,22 +9,18 @@
  * file that was distributed with this source code.
  */
 
-namespace Symfony\Tests\Component\DependencyInjection\Extension;
+namespace Symfony\Tests\Component\Config\Definition;
 
-use Symfony\Component\DependencyInjection\Extension\Extension;
+use Symfony\Component\Config\Definition\Processor;
 
-require_once __DIR__.'/../Fixtures/includes/ProjectExtension.php';
-
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-
-class ExtensionTest extends \PHPUnit_Framework_TestCase
+class ProcessorTest extends \PHPUnit_Framework_TestCase
 {
     /**
      * @dataProvider getKeyNormalizationTests
      */
     public function testNormalizeKeys($denormalized, $normalized)
     {
-        $this->assertSame($normalized, Extension::normalizeKeys($denormalized));
+        $this->assertSame($normalized, Processor::normalizeKeys($denormalized));
     }
 
     public function getKeyNormalizationTests()

+ 2 - 2
tests/Symfony/Tests/Component/DependencyInjection/Fixtures/includes/ProjectExtension.php

@@ -2,9 +2,9 @@
 
 use Symfony\Component\DependencyInjection\ContainerBuilder;
 use Symfony\Component\DependencyInjection\Definition;
-use Symfony\Component\DependencyInjection\Extension\Extension;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
 
-class ProjectExtension extends Extension
+class ProjectExtension implements ExtensionInterface
 {
     public function load(array $configs, ContainerBuilder $configuration)
     {

+ 0 - 4
tests/Symfony/Tests/Component/DependencyInjection/Fixtures/includes/ProjectWithXsdExtension.php

@@ -1,9 +1,5 @@
 <?php
 
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\DependencyInjection\Definition;
-use Symfony\Component\DependencyInjection\Extension\Extension;
-
 class ProjectWithXsdExtension extends ProjectExtension
 {
     public function getXsdValidationBasePath()

BIN
tests/Symfony/Tests/Component/DependencyInjection/Fixtures/includes/ProjectWithXsdExtensionInPhar.phar


+ 47 - 0
tests/Symfony/Tests/Component/DependencyInjection/Fixtures/includes/createphar.php

@@ -0,0 +1,47 @@
+<?php
+
+$file = __DIR__ . '/ProjectWithXsdExtensionInPhar.phar';
+if (is_file($file)) {
+    @unlink($file);
+}
+
+$phar = new Phar($file, 0, 'ProjectWithXsdExtensionInPhar.phar');
+$phar->addFromString('ProjectWithXsdExtensionInPhar.php',<<<EOT
+<?php
+
+class ProjectWithXsdExtensionInPhar extends ProjectExtension
+{
+    public function getXsdValidationBasePath()
+    {
+        return __DIR__.'/schema';
+    }
+
+    public function getNamespace()
+    {
+        return 'http://www.example.com/schema/projectwithxsdinphar';
+    }
+
+    public function getAlias()
+    {
+        return 'projectwithxsdinphar';
+    }
+}
+EOT
+);
+$phar->addFromString('schema/project-1.0.xsd', <<<EOT
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<xsd:schema xmlns="http://www.example.com/schema/projectwithxsdinphar"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://www.example.com/schema/projectwithxsdinphar"
+    elementFormDefault="qualified">
+
+  <xsd:element name="bar" type="bar" />
+
+  <xsd:complexType name="bar">
+    <xsd:attribute name="foo" type="xsd:string" />
+  </xsd:complexType>
+</xsd:schema>
+EOT
+);
+$phar->setStub('<?php require_once "phar://ProjectWithXsdExtensionInPhar.phar/ProjectWithXsdExtensionInPhar.php"; __HALT_COMPILER(); ?>');