diff --git a/src/Symfony/Components/DependencyInjection/Loader/LoaderExtensionInterface.php b/src/Symfony/Components/DependencyInjection/Loader/LoaderExtensionInterface.php index 85e19e7ab4..cd94acfb56 100644 --- a/src/Symfony/Components/DependencyInjection/Loader/LoaderExtensionInterface.php +++ b/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. * diff --git a/src/Symfony/Components/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Components/DependencyInjection/Loader/XmlFileLoader.php index 3c74c47ebd..35b5d4a043 100644 --- a/src/Symfony/Components/DependencyInjection/Loader/XmlFileLoader.php +++ b/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; + } } }