From 57e9d28795e683f6242bfe574eb767a4ac10eb6f Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Thu, 6 Dec 2012 13:09:44 +0100 Subject: [PATCH] [DI] Add a base class for extension --- .../DependencyInjection/CHANGELOG.md | 6 + .../Extension/Extension.php | 107 ++++++++++++++++++ .../DependencyInjection/Extension.php | 93 +-------------- 3 files changed, 116 insertions(+), 90 deletions(-) create mode 100644 src/Symfony/Component/DependencyInjection/Extension/Extension.php diff --git a/src/Symfony/Component/DependencyInjection/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md index 8f5d6b32c8..7a17f93f46 100644 --- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md +++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md @@ -1,6 +1,12 @@ CHANGELOG ========= +2.2.0 +----- + + * added an Extension base class with sensible defaults to be used in conjunction + with the Config component. + 2.1.0 ----- diff --git a/src/Symfony/Component/DependencyInjection/Extension/Extension.php b/src/Symfony/Component/DependencyInjection/Extension/Extension.php new file mode 100644 index 0000000000..e5c51a7b58 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Extension/Extension.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\DependencyInjection\Extension; + +use Symfony\Component\DependencyInjection\Container; +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\Config\Definition\Processor; +use Symfony\Component\Config\Definition\ConfigurationInterface; + +/** + * Provides useful features shared by many extensions. + * + * @author Fabien Potencier + */ +abstract class Extension implements ExtensionInterface, ConfigurationExtensionInterface +{ + /** + * Returns the base path for the XSD files. + * + * @return string The XSD base path + */ + public function getXsdValidationBasePath() + { + return false; + } + + /** + * Returns the namespace to be used for this extension (XML namespace). + * + * @return string The XML namespace + */ + public function getNamespace() + { + return 'http://example.org/schema/dic/'.$this->getAlias(); + } + + /** + * Returns the recommended alias to use in XML. + * + * This alias is also the mandatory prefix to use when using YAML. + * + * This convention is to remove the "Extension" postfix from the class + * name and then lowercase and underscore the result. So: + * + * AcmeHelloExtension + * + * becomes + * + * acme_hello + * + * This can be overridden in a sub-class to specify the alias manually. + * + * @return string The alias + * + * @throws \BadMethodCallException When the extension name does not follow conventions + */ + public function getAlias() + { + $className = get_class($this); + if (substr($className, -9) != 'Extension') { + throw new \BadMethodCallException('This extension does not follow the naming convention; you must overwrite the getAlias() method.'); + } + $classBaseName = substr(strrchr($className, '\\'), 1, -9); + + return Container::underscore($classBaseName); + } + + final protected function processConfiguration(ConfigurationInterface $configuration, array $configs) + { + $processor = new Processor(); + + return $processor->processConfiguration($configuration, $configs); + } + + /** + * {@inheritDoc} + */ + public function getConfiguration(array $config, ContainerBuilder $container) + { + $reflected = new \ReflectionClass($this); + $namespace = $reflected->getNamespaceName(); + + $class = $namespace . '\\Configuration'; + if (class_exists($class)) { + $r = new \ReflectionClass($class); + $container->addResource(new FileResource($r->getFileName())); + + if (!method_exists($class, '__construct')) { + $configuration = new $class(); + + return $configuration; + } + } + + return null; + } +} diff --git a/src/Symfony/Component/HttpKernel/DependencyInjection/Extension.php b/src/Symfony/Component/HttpKernel/DependencyInjection/Extension.php index e03ed88b50..2ca0f13284 100644 --- a/src/Symfony/Component/HttpKernel/DependencyInjection/Extension.php +++ b/src/Symfony/Component/HttpKernel/DependencyInjection/Extension.php @@ -11,20 +11,14 @@ namespace Symfony\Component\HttpKernel\DependencyInjection; -use Symfony\Component\Config\Definition\Processor; -use Symfony\Component\Config\Resource\FileResource; -use Symfony\Component\Config\Definition\ConfigurationInterface; -use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; -use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface; -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Container; +use Symfony\Component\DependencyInjection\Extension\Extension as BaseExtension; /** - * Provides useful features shared by many extensions. + * Allow adding classes to the class cache. * * @author Fabien Potencier */ -abstract class Extension implements ExtensionInterface, ConfigurationExtensionInterface +abstract class Extension extends BaseExtension { private $classes = array(); @@ -47,85 +41,4 @@ abstract class Extension implements ExtensionInterface, ConfigurationExtensionIn { $this->classes = array_merge($this->classes, $classes); } - - /** - * Returns the base path for the XSD files. - * - * @return string The XSD base path - */ - public function getXsdValidationBasePath() - { - return false; - } - - /** - * Returns the namespace to be used for this extension (XML namespace). - * - * @return string The XML namespace - */ - public function getNamespace() - { - return 'http://example.org/schema/dic/'.$this->getAlias(); - } - - /** - * Returns the recommended alias to use in XML. - * - * This alias is also the mandatory prefix to use when using YAML. - * - * This convention is to remove the "Extension" postfix from the class - * name and then lowercase and underscore the result. So: - * - * AcmeHelloExtension - * - * becomes - * - * acme_hello - * - * This can be overridden in a sub-class to specify the alias manually. - * - * @return string The alias - * - * @throws \BadMethodCallException When the extension name does not follow conventions - */ - public function getAlias() - { - $className = get_class($this); - if (substr($className, -9) != 'Extension') { - throw new \BadMethodCallException('This extension does not follow the naming convention; you must overwrite the getAlias() method.'); - } - $classBaseName = substr(strrchr($className, '\\'), 1, -9); - - return Container::underscore($classBaseName); - } - - final protected function processConfiguration(ConfigurationInterface $configuration, array $configs, $normalizeKeys = true) - { - $processor = new Processor(); - - return $processor->processConfiguration($configuration, $configs, $normalizeKeys); - } - - /** - * {@inheritDoc} - */ - public function getConfiguration(array $config, ContainerBuilder $container) - { - $reflected = new \ReflectionClass($this); - $namespace = $reflected->getNamespaceName(); - - $class = $namespace . '\\Configuration'; - if (class_exists($class)) { - $r = new \ReflectionClass($class); - $container->addResource(new FileResource($r->getFileName())); - - if (!method_exists($class, '__construct')) { - $configuration = new $class(); - - return $configuration; - } - } - - return null; - } }