2015-08-17 17:00:26 -07:00
< ? 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 ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\Config\Definition\ConfigurationInterface ;
use Symfony\Component\Config\Definition\Processor ;
2015-08-17 17:00:26 -07:00
use Symfony\Component\DependencyInjection\Container ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\DependencyInjection\ContainerBuilder ;
2015-08-17 17:00:26 -07:00
use Symfony\Component\DependencyInjection\Exception\BadMethodCallException ;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException ;
/**
* Provides useful features shared by many extensions .
*
* @ author Fabien Potencier < fabien @ symfony . com >
*/
abstract class Extension implements ExtensionInterface , ConfigurationExtensionInterface
{
2018-11-23 12:29:20 +00:00
private $processedConfigs = array ();
2015-08-17 17:00:26 -07:00
/**
2017-02-02 16:28:38 -08:00
* { @ inheritdoc }
2015-08-17 17:00:26 -07:00
*/
public function getXsdValidationBasePath ()
{
return false ;
}
/**
2017-02-02 16:28:38 -08:00
* { @ inheritdoc }
2015-08-17 17:00:26 -07:00
*/
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 ()
{
2018-11-23 12:29:20 +00:00
$className = \get_class ( $this );
if ( 'Extension' != substr ( $className , - 9 )) {
2015-08-17 17:00:26 -07:00
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 );
}
/**
* { @ inheritdoc }
*/
public function getConfiguration ( array $config , ContainerBuilder $container )
{
2018-11-23 12:29:20 +00:00
$class = \get_class ( $this );
$class = substr_replace ( $class , '\Configuration' , strrpos ( $class , '\\' ));
$class = $container -> getReflectionClass ( $class );
$constructor = $class ? $class -> getConstructor () : null ;
2015-08-17 17:00:26 -07:00
2018-11-23 12:29:20 +00:00
if ( $class && ( ! $constructor || ! $constructor -> getNumberOfRequiredParameters ())) {
return $class -> newInstance ();
2015-08-17 17:00:26 -07:00
}
}
final protected function processConfiguration ( ConfigurationInterface $configuration , array $configs )
{
$processor = new Processor ();
2018-11-23 12:29:20 +00:00
return $this -> processedConfigs [] = $processor -> processConfiguration ( $configuration , $configs );
}
/**
* @ internal
*/
final public function getProcessedConfigs ()
{
try {
return $this -> processedConfigs ;
} finally {
$this -> processedConfigs = array ();
}
2015-08-17 17:00:26 -07:00
}
/**
* @ return bool Whether the configuration is enabled
*
* @ throws InvalidArgumentException When the config is not enableable
*/
protected function isConfigEnabled ( ContainerBuilder $container , array $config )
{
if ( ! array_key_exists ( 'enabled' , $config )) {
throw new InvalidArgumentException ( " The config array has no 'enabled' key. " );
}
return ( bool ) $container -> getParameterBag () -> resolveValue ( $config [ 'enabled' ]);
}
}