浏览代码

[DependencyInjection] fixed XSD validation local path locations for extensions

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

+ 7 - 0
src/Symfony/Components/DependencyInjection/Loader/LoaderExtensionInterface.php

@@ -45,6 +45,13 @@ interface LoaderExtensionInterface
    */
   public function getNamespace();
 
+  /**
+   * Returns the base path for the XSD files.
+   *
+   * @return string The XSD base path
+   */
+  public function getXsdValidationBasePath();
+
   /**
    * Returns the recommanded alias to use in XML.
    *

+ 11 - 1
src/Symfony/Components/DependencyInjection/Loader/XmlFileLoader.php

@@ -258,7 +258,17 @@ class XmlFileLoader extends FileLoader
       $items = preg_split('/\s+/', $element);
       for ($i = 0, $nb = count($items); $i < $nb; $i += 2)
       {
-        $schemaLocations[$items[$i]] = str_replace('http://www.symfony-project.org/', str_replace('\\', '/', __DIR__).'/', $items[$i + 1]);
+        if ($extension = static::getExtension($items[$i]))
+        {
+          $path = str_replace('http://www.symfony-project.org/', str_replace('\\', '/', $extension->getXsdValidationBasePath()).'/', $items[$i + 1]);
+
+          if (!file_exists($path))
+          {
+            throw new \RuntimeException(sprintf('Extension "%s" references a non-existent XSD file "%s"', get_class($extension), $path));
+          }
+
+          $schemaLocations[$items[$i]] = $path;
+        }
       }
     }