merged branch vicb/di/ext (PR #6207)
This PR was squashed before being merged into the master branch (closes #6207).
Commits
-------
57e9d28
[DI] Add a base class for extension
Discussion
----------
[DI] Add a base class for extension
depends on #6148
@fabpot should we change `addClassesToCompile` & the likes (thinking of traits).
---------------------------------------------------------------------------
by fabpot at 2012-12-06T13:05:05Z
Can you rebase?
---------------------------------------------------------------------------
by fabpot at 2012-12-06T13:06:43Z
hmmm, now that I see the result, I'm not sure it is worth it as the Extension class in the DI component depends on the Config one.
---------------------------------------------------------------------------
by vicb at 2012-12-06T13:23:29Z
No pb, I can remove it, should I remove the `ContainerBuilder` altogether ?
---------------------------------------------------------------------------
by fabpot at 2012-12-06T13:37:18Z
I would keep everything that is strictly in the DI namespace in the DI extension class and everything else in the HttpKernel class as it is now.
---------------------------------------------------------------------------
by vicb at 2012-12-06T13:38:59Z
But this change is **great** if you need the DI without the full stack.
What about my other comment ?
---------------------------------------------------------------------------
by fabpot at 2012-12-06T13:55:30Z
Which other comment? This one? "should I remove the ContainerBuilder altogether?" In which case, I don't understand what it means.
What about adding 2 classes in the DI component: the base one and another one with the dependency on the config component? Is it overkill?
---------------------------------------------------------------------------
by vicb at 2012-12-06T14:06:43Z
> "should I remove the ContainerBuilder altogether?"
I mean that the **widely used** (ie loaders) `ContainerBuilder` also depends on Config - that was kind of a joke !
I was refering to my first comment here
> should we change addClassesToCompile & the likes (thinking of traits).
Overkill I don't know but useless for sure: the `ExtensionInterface` depends on `ContainerBuilder` which depends on `Config`.
This commit is contained in:
commit
9de5ffadf6
@ -1,6 +1,12 @@
|
|||||||
CHANGELOG
|
CHANGELOG
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
2.2.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
* added an Extension base class with sensible defaults to be used in conjunction
|
||||||
|
with the Config component.
|
||||||
|
|
||||||
2.1.0
|
2.1.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@ -0,0 +1,107 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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 <fabien@symfony.com>
|
||||||
|
*/
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
@ -11,20 +11,14 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\HttpKernel\DependencyInjection;
|
namespace Symfony\Component\HttpKernel\DependencyInjection;
|
||||||
|
|
||||||
use Symfony\Component\Config\Definition\Processor;
|
use Symfony\Component\DependencyInjection\Extension\Extension as BaseExtension;
|
||||||
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;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides useful features shared by many extensions.
|
* Allow adding classes to the class cache.
|
||||||
*
|
*
|
||||||
* @author Fabien Potencier <fabien@symfony.com>
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
*/
|
*/
|
||||||
abstract class Extension implements ExtensionInterface, ConfigurationExtensionInterface
|
abstract class Extension extends BaseExtension
|
||||||
{
|
{
|
||||||
private $classes = array();
|
private $classes = array();
|
||||||
|
|
||||||
@ -47,85 +41,4 @@ abstract class Extension implements ExtensionInterface, ConfigurationExtensionIn
|
|||||||
{
|
{
|
||||||
$this->classes = array_merge($this->classes, $classes);
|
$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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user