浏览代码

[DependencyInjection] added autodetection of resource format when importing a resource in an XML or YAML file

Fabien Potencier 15 年之前
父节点
当前提交
bb3340d950

+ 13 - 2
src/Symfony/Components/DependencyInjection/Loader/XmlFileLoader.php

@@ -86,16 +86,27 @@ class XmlFileLoader extends FileLoader
 
   protected function parseImport($import, $file)
   {
+    $class = null;
     if (isset($import['class']) && $import['class'] !== get_class($this))
     {
       $class = (string) $import['class'];
-      $loader = new $class($this->paths);
     }
     else
     {
-      $loader = $this;
+      // try to detect loader with the extension
+      switch (pathinfo((string) $import['resource'], PATHINFO_EXTENSION))
+      {
+        case 'yml':
+          $class = 'Symfony\\Components\\DependencyInjection\\Loader\\YamlFileLoader';
+          break;
+        case 'ini':
+          $class = 'Symfony\\Components\\DependencyInjection\\Loader\\IniFileLoader';
+          break;
+      }
     }
 
+    $loader = null === $class ? $this : new $class($this->paths);
+
     $importedFile = $this->getAbsolutePath((string) $import['resource'], dirname($file));
 
     return $loader->load($importedFile);

+ 13 - 2
src/Symfony/Components/DependencyInjection/Loader/YamlFileLoader.php

@@ -87,16 +87,27 @@ class YamlFileLoader extends FileLoader
 
   protected function parseImport($import, $file)
   {
+    $class = null;
     if (isset($import['class']) && $import['class'] !== get_class($this))
     {
       $class = $import['class'];
-      $loader = new $class($this->paths);
     }
     else
     {
-      $loader = $this;
+      // try to detect loader with the extension
+      switch (pathinfo((string) $import['resource'], PATHINFO_EXTENSION))
+      {
+        case 'xml':
+          $class = 'Symfony\\Components\\DependencyInjection\\Loader\\XmlFileLoader';
+          break;
+        case 'ini':
+          $class = 'Symfony\\Components\\DependencyInjection\\Loader\\IniFileLoader';
+          break;
+      }
     }
 
+    $loader = null === $class ? $this : new $class($this->paths);
+
     $importedFile = $this->getAbsolutePath($import['resource'], dirname($file));
 
     return $loader->load($importedFile);

+ 2 - 0
tests/fixtures/Symfony/Components/DependencyInjection/ini/parameters2.ini

@@ -0,0 +1,2 @@
+[parameters]
+  imported_from_ini = true

+ 9 - 0
tests/fixtures/Symfony/Components/DependencyInjection/xml/services13.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" ?>
+
+<container xmlns="http://www.symfony-project.org/schema/dic/services"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.symfony-project.org/schema/dic/services http://www.symfony-project.org/schema/dic/services/services-1.0.xsd">
+  <parameters>
+    <parameter key="imported_from_xml">true</parameter>
+  </parameters>
+</container>

+ 2 - 0
tests/fixtures/Symfony/Components/DependencyInjection/xml/services4.xml

@@ -7,5 +7,7 @@
     <import resource="services2.xml" />
     <import resource="services3.xml" />
     <import resource="../ini/parameters.ini" class="Symfony\Components\DependencyInjection\Loader\IniFileLoader" />
+    <import resource="../ini/parameters2.ini" />
+    <import resource="../yaml/services13.yml" />
   </imports>
 </container>

+ 3 - 0
tests/fixtures/Symfony/Components/DependencyInjection/yaml/services13.yml

@@ -0,0 +1,3 @@
+# used to test imports in XML
+parameters:
+  imported_from_yaml: true

+ 2 - 0
tests/fixtures/Symfony/Components/DependencyInjection/yaml/services4.yml

@@ -2,3 +2,5 @@ imports:
   - { resource: services2.yml }
   - { resource: services3.yml }
   - { resource: "../ini/parameters.ini", class: Symfony\Components\DependencyInjection\Loader\IniFileLoader }
+  - { resource: "../ini/parameters2.ini" }
+  - { resource: "../xml/services13.xml" }

+ 1 - 1
tests/unit/Symfony/Components/DependencyInjection/Loader/XmlFileLoaderTest.php

@@ -82,7 +82,7 @@ $t->is($config->getParameters(), array('a string', 'foo' => 'bar', 'values' => a
 // ->load() # imports
 $t->diag('->load() # imports');
 $config = $loader->load('services4.xml');
-$t->is($config->getParameters(), array('a string', 'foo' => 'bar', 'bar' => '%foo%', 'values' => array(true, false), 'foo_bar' => new Reference('foo_bar')), '->load() imports and merges imported files');
+$t->is($config->getParameters(), array('a string', 'foo' => 'bar', 'bar' => '%foo%', 'values' => array(true, false), 'foo_bar' => new Reference('foo_bar'), 'imported_from_yaml' => true, 'imported_from_ini' => true), '->load() imports and merges imported files');
 
 // ->load() # anonymous services
 $t->diag('->load() # anonymous services');

+ 1 - 1
tests/unit/Symfony/Components/DependencyInjection/Loader/YamlFileLoaderTest.php

@@ -79,7 +79,7 @@ $t->is($config->getParameters(), array('foo' => 'bar', 'values' => array(true, f
 // ->load() # imports
 $t->diag('->load() # imports');
 $config = $loader->load('services4.yml');
-$t->is($config->getParameters(), array('foo' => 'bar', 'bar' => '%foo%', 'values' => array(true, false), 'foo_bar' => new Reference('foo_bar')), '->load() imports and merges imported files');
+$t->is($config->getParameters(), array('foo' => 'bar', 'bar' => '%foo%', 'values' => array(true, false), 'foo_bar' => new Reference('foo_bar'), 'imported_from_xml' => true, 'imported_from_ini' => true), '->load() imports and merges imported files');
 
 // ->load() # services
 $t->diag('->load() # services');