Skip to content

Commit

Permalink
implicitly load all registered bundles, all loading is now handled by…
Browse files Browse the repository at this point in the history
… load(), disable loading of an extension explcitly via setting the extension config to false (for now only Yaml is implemented)
  • Loading branch information
lsmith77 authored and fabpot committed Feb 15, 2011
1 parent 14aa95b commit 7f182bd
Show file tree
Hide file tree
Showing 15 changed files with 105 additions and 73 deletions.
Expand Up @@ -30,6 +30,28 @@
*/
class DoctrineExtension extends AbstractDoctrineExtension
{
public function load(array $configs, ContainerBuilder $container)
{
$dbal = $orm = array();
foreach ($configs as $config) {
if (isset($config['dbal'])) {
$dbal[] = $config['dbal'];
}

if (isset($config['orm'])) {
$orm[] = $config['orm'];
}
}

if (!empty($dbal)) {
$this->dbalLoad($dbal, $container);
}

if (!empty($orm)) {
$this->ormLoad($orm, $container);
}
}

/**
* Loads the DBAL configuration.
*
Expand All @@ -40,7 +62,7 @@ class DoctrineExtension extends AbstractDoctrineExtension
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
public function dbalLoad(array $configs, ContainerBuilder $container)
protected function dbalLoad(array $configs, ContainerBuilder $container)
{
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('dbal.xml');
Expand Down Expand Up @@ -230,7 +252,7 @@ protected function loadDbalConnection(array $connection, ContainerBuilder $conta
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
public function ormLoad(array $configs, ContainerBuilder $container)
protected function ormLoad(array $configs, ContainerBuilder $container)
{
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('orm.xml');
Expand Down
Expand Up @@ -28,10 +28,7 @@ class AddClassesToAutoloadMapPass implements CompilerPassInterface
public function process(ContainerBuilder $container)
{
$classes = array();
foreach ($container->getExtensionConfigs() as $name => $configs) {
list($namespace, $tag) = explode(':', $name);

$extension = $container->getExtension($namespace);
foreach ($container->getExtensions() as $extension) {
if ($extension instanceof Extension) {
$classes = array_merge($classes, $extension->getAutoloadClassMap());
}
Expand Down
Expand Up @@ -28,10 +28,7 @@ class AddClassesToCachePass implements CompilerPassInterface
public function process(ContainerBuilder $container)
{
$classes = array();
foreach ($container->getExtensionConfigs() as $name => $configs) {
list($namespace, $tag) = explode(':', $name);

$extension = $container->getExtension($namespace);
foreach ($container->getExtensions() as $extension) {
if ($extension instanceof Extension) {
$classes = array_merge($classes, $extension->getClassesToCompile());
}
Expand Down
Expand Up @@ -30,6 +30,13 @@
*/
class FrameworkExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
foreach ($configs as $config) {
$this->doConfigLoad($config, $container);
}
}

/**
* Responds to the app.config configuration parameter.
*
Expand Down
Expand Up @@ -45,7 +45,19 @@ public function __construct()
$this->configuration = new Configuration();
}

public function configLoad(array $configs, ContainerBuilder $container)
public function load(array $configs, ContainerBuilder $container)
{
foreach ($configs as $config) {
if (isset($config['acl'])) {
$this->doAclLoad($this->normalizeKeys($config['acl']), $container);
unset($config['acl']);
}

$this->doConfigLoad($this->normalizeKeys($config), $container);
}
}

public function doConfigLoad(array $configs, ContainerBuilder $container)
{
$processor = new Processor();

Expand Down Expand Up @@ -78,7 +90,7 @@ public function configLoad(array $configs, ContainerBuilder $container)
}
}

public function aclLoad(array $configs, ContainerBuilder $container)
public function doAclLoad(array $configs, ContainerBuilder $container)
{
$processor = new Processor();
$config = $processor->process($this->configuration->getAclConfigTree(), $configs);
Expand Down
Expand Up @@ -24,7 +24,7 @@
*/
class SwiftMailerExtension extends Extension
{
public function configLoad(array $configs, ContainerBuilder $container)
public function load(array $configs, ContainerBuilder $container)
{
foreach ($configs as $config) {
$this->doConfigLoad($config, $container);
Expand Down
Expand Up @@ -24,7 +24,7 @@
*/
class TwigExtension extends Extension
{
public function configLoad(array $configs, ContainerBuilder $container)
public function load(array $configs, ContainerBuilder $container)
{
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('twig.xml');
Expand Down
Expand Up @@ -33,7 +33,7 @@
*/
class WebProfilerExtension extends Extension
{
public function configLoad(array $configs, ContainerBuilder $container)
public function load(array $configs, ContainerBuilder $container)
{
foreach ($configs as $config) {
$this->doConfigLoad($config, $container);
Expand Down
Expand Up @@ -35,7 +35,7 @@ class ZendExtension extends Extension
* @param array $config An array of configuration settings
* @param ContainerBuilder $container A ContainerBuilder instance
*/
public function configLoad(array $configs, ContainerBuilder $container)
public function load(array $configs, ContainerBuilder $container)
{
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('logger.xml');
Expand Down
Expand Up @@ -29,17 +29,17 @@ public function process(ContainerBuilder $container)
$definitions = $container->getDefinitions();
$aliases = $container->getAliases();

foreach ($container->getExtensionConfigs() as $name => $configs) {
list($namespace, $tag) = explode(':', $name);
foreach ($container->getExtensions() as $alias => $extension) {

$extension = $container->getExtension($namespace);
$configs = $container->getExtensionConfig($alias);
if ($configs !== false) {
$tmpContainer = new ContainerBuilder($container->getParameterBag());
$tmpContainer->addObjectResource($extension);

$tmpContainer = new ContainerBuilder($container->getParameterBag());
$tmpContainer->addObjectResource($extension);
$extension->load($configs, $tmpContainer);

$extension->load($tag, $configs, $tmpContainer);

$container->merge($tmpContainer);
$container->merge($tmpContainer);
}
}

$container->addDefinitions($definitions);
Expand Down
46 changes: 37 additions & 9 deletions src/Symfony/Component/DependencyInjection/ContainerBuilder.php
Expand Up @@ -28,6 +28,7 @@
class ContainerBuilder extends Container implements TaggedContainerInterface
{
static protected $extensions = array();
static protected $extensionsByNs = array();

protected $definitions = array();
protected $aliases = array();
Expand Down Expand Up @@ -57,7 +58,7 @@ static public function registerExtension(ExtensionInterface $extension)
static::$extensions[$extension->getAlias()] = $extension;

if (false !== $extension->getNamespace()) {
static::$extensions[$extension->getNamespace()] = $extension;
static::$extensionsByNs[$extension->getNamespace()] = $extension;
}
}

Expand All @@ -70,13 +71,27 @@ static public function registerExtension(ExtensionInterface $extension)
*/
static public function getExtension($name)
{
if (!isset(static::$extensions[$name])) {
throw new \LogicException(sprintf('Container extension "%s" is not registered', $name));
if (empty(static::$extensions[$name])) {
if (empty(static::$extensionsByNs[$name])) {
throw new \LogicException(sprintf('Container extension "%s" is not registered', $name));
}

return static::$extensionsByNs[$name];
}

return static::$extensions[$name];
}

/**
* Returns extensions keyed by alias
*
* @return array ExtensionInterfaces
*/
static public function getExtensions()
{
return static::$extensions;
}

/**
* Checks if we have an extension.
*
Expand All @@ -85,7 +100,7 @@ static public function getExtension($name)
*/
static public function hasExtension($name)
{
return isset(static::$extensions[$name]);
return isset(static::$extensions[$name]) || isset(static::$extensionsByNs[$name]);
}

/**
Expand Down Expand Up @@ -129,24 +144,23 @@ public function addObjectResource($object)
* Loads the configuration for an extension.
*
* @param string $extension The extension alias or namespace
* @param string $tag The extension tag to load (without the namespace - namespace.tag)
* @param array $values An array of values that customizes the extension
*
* @return ContainerBuilder The current instance
*/
public function loadFromExtension($extension, $tag, array $values = array())
public function loadFromExtension($extension, array $values = array())
{
if (true === $this->isFrozen()) {
throw new \LogicException('Cannot load from an extension on a frozen container.');
}

$namespace = $this->getExtension($extension)->getAlias();

if (!isset($this->extensionConfigs[$namespace.':'.$tag])) {
$this->extensionConfigs[$namespace.':'.$tag] = array();
if (!isset($this->extensionConfigs[$namespace])) {
$this->extensionConfigs[$namespace] = array();
}

$this->extensionConfigs[$namespace.':'.$tag][] = $this->getParameterBag()->resolveValue($values);
$this->extensionConfigs[$namespace][] = $this->getParameterBag()->resolveValue($values);

return $this;
}
Expand Down Expand Up @@ -365,6 +379,20 @@ public function getExtensionConfigs()
return $this->extensionConfigs;
}

/**
* Returns the containers for the registered extensions by alias.
*
* @return ExtensionInterface extension container
*/
public function getExtensionConfig($name)
{
if (empty($this->extensionConfigs[$name])) {
return array(array());
}

return $this->extensionConfigs[$name];
}

/**
* Sets the extension configs array
*
Expand Down
18 changes: 0 additions & 18 deletions src/Symfony/Component/DependencyInjection/Extension/Extension.php
Expand Up @@ -20,24 +20,6 @@
*/
abstract class Extension implements ExtensionInterface
{
/**
* Loads a specific configuration.
*
* @param string $tag The tag name
* @param array $config An array of configuration values
* @param ContainerBuilder $configuration A ContainerBuilder instance
*
* @throws \InvalidArgumentException When provided tag is not defined in this extension
*/
public function load($tag, array $config, ContainerBuilder $configuration)
{
if (!method_exists($this, $method = $tag.'Load')) {
throw new \InvalidArgumentException(sprintf('The tag "%s:%s" is not defined in the "%s" extension.', $this->getAlias(), $tag, $this->getAlias()));
}

$this->$method($config, $configuration);
}

/**
* This method normalizes keys between the different configuration formats
*
Expand Down
Expand Up @@ -23,15 +23,12 @@ interface ExtensionInterface
/**
* Loads a specific configuration.
*
* @param string $tag The tag name
* @param array $config An array of configuration values
* @param ContainerBuilder $configuration A ContainerBuilder instance
*
* @return ContainerBuilder A ContainerBuilder instance
*
* @throws \InvalidArgumentException When provided tag is not defined in this extension
*/
function load($tag, array $config, ContainerBuilder $configuration);
function load(array $config, ContainerBuilder $configuration);

/**
* Returns the namespace to be used for this extension (XML namespace).
Expand Down
Expand Up @@ -463,7 +463,7 @@ protected function loadFromExtensions(SimpleXMLElement $xml)
$values = array();
}

$this->container->loadFromExtension($node->namespaceURI, $node->localName, $values);
$this->container->loadFromExtension($node->namespaceURI, $values);
}
}

Expand Down
Expand Up @@ -280,22 +280,14 @@ protected function validate($content, $file)
throw new \InvalidArgumentException(sprintf('The service file "%s" is not valid.', $file));
}

foreach (array_keys($content) as $key) {
if (in_array($key, array('imports', 'parameters', 'services', 'interfaces'))) {
foreach (array_keys($content) as $namespace) {
if (in_array($namespace, array('imports', 'parameters', 'services', 'interfaces'))) {
continue;
}

// can it be handled by an extension?
if (false !== strpos($key, '.')) {
list($namespace, $tag) = explode('.', $key);
if (!$this->container->hasExtension($namespace)) {
throw new \InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in %s).', $key, $file));
}

continue;
if (!$this->container->hasExtension($namespace)) {
throw new \InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in %s).', $key, $file));
}

throw new \InvalidArgumentException(sprintf('The "%s" tag is not valid (in %s).', $key, $file));
}

return $content;
Expand Down Expand Up @@ -341,18 +333,16 @@ protected function resolveServices($value)
*/
protected function loadFromExtensions($content)
{
foreach ($content as $key => $values) {
if (in_array($key, array('imports', 'parameters', 'services', 'interfaces'))) {
foreach ($content as $namespace => $values) {
if (in_array($namespace, array('imports', 'parameters', 'services', 'interfaces'))) {
continue;
}

list($namespace, $tag) = explode('.', $key);

if (!is_array($values)) {
$values = array();
}

$this->container->loadFromExtension($namespace, $tag, $values);
$this->container->loadFromExtension($namespace, $values);
}
}
}

0 comments on commit 7f182bd

Please sign in to comment.