moved DI extensions classes to their own sub-namespace

This commit is contained in:
Fabien Potencier 2010-07-16 09:12:58 +02:00
parent 47fd5e848b
commit 2a051b5039
37 changed files with 318 additions and 320 deletions

View File

@ -2,7 +2,7 @@
namespace Symfony\Bundle\DoctrineBundle\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Definition;
@ -24,7 +24,7 @@ use Symfony\Components\DependencyInjection\Reference;
* @subpackage Bundle_DoctrineBundle
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class DoctrineExtension extends LoaderExtension
class DoctrineExtension extends Extension
{
protected $resources;
protected $alias;
@ -59,8 +59,8 @@ class DoctrineExtension extends LoaderExtension
public function dbalLoad($config, ContainerBuilder $container)
{
if (!$container->hasDefinition('doctrine.dbal.logger')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['dbal']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['dbal']);
}
$defaultConnection = array(
@ -142,8 +142,8 @@ class DoctrineExtension extends LoaderExtension
*/
public function ormLoad($config, ContainerBuilder $container)
{
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['orm']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['orm']);
if (isset($config['default_entity_manager'])) {
$container->getParameter('doctrine.orm.default_entity_manager', $config['default_entity_manager']);

View File

@ -4,6 +4,7 @@ namespace Symfony\Bundle\DoctrineBundle;
use Symfony\Framework\Bundle\Bundle;
use Symfony\Components\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Loader\Loader;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Bundle\DoctrineBundle\DependencyInjection\DoctrineExtension;
@ -36,7 +37,7 @@ class DoctrineBundle extends Bundle
*/
public function buildContainer(ParameterBagInterface $parameterBag)
{
Loader::registerExtension(new DoctrineExtension($parameterBag->get('kernel.bundle_dirs'), $parameterBag->get('kernel.bundles')));
ContainerBuilder::registerExtension(new DoctrineExtension($parameterBag->get('kernel.bundle_dirs'), $parameterBag->get('kernel.bundles')));
$metadataDirs = array();
$entityDirs = array();

View File

@ -2,7 +2,7 @@
namespace Symfony\Bundle\DoctrineMongoDBBundle\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Reference;
@ -18,7 +18,7 @@ use Symfony\Components\DependencyInjection\Resource\FileResource;
*
* @todo Add support for multiple document managers
*/
class MongoDBExtension extends LoaderExtension
class MongoDBExtension extends Extension
{
protected $bundles;
protected $resources = array(
@ -38,8 +38,8 @@ class MongoDBExtension extends LoaderExtension
*/
public function mongodbLoad($config, ContainerBuilder $container)
{
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['mongodb']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['mongodb']);
if (!$container->hasDefinition('doctrine.odm.mongodb.document_manager')) {

View File

@ -25,6 +25,6 @@ class DoctrineMongoDBBundle extends Bundle
*/
public function buildContainer(ParameterBagInterface $parameterBag)
{
Loader::registerExtension(new MongoDBExtension($parameterBag->get('kernel.bundles')));
ContainerBuilder::registerExtension(new MongoDBExtension($parameterBag->get('kernel.bundles')));
}
}

View File

@ -2,7 +2,7 @@
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\Resource\FileResource;
use Symfony\Components\DependencyInjection\ContainerBuilder;
@ -25,7 +25,7 @@ use Symfony\Components\DependencyInjection\Definition;
* @subpackage Bundle_FrameworkBundle
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class WebExtension extends LoaderExtension
class WebExtension extends Extension
{
protected $resources = array(
'templating' => 'templating.xml',
@ -53,8 +53,8 @@ class WebExtension extends LoaderExtension
public function configLoad($config, ContainerBuilder $container)
{
if (!$container->hasDefinition('controller_manager')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['web']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['web']);
}
if (isset($config['ide']) && 'textmate' === $config['ide']) {
@ -68,9 +68,9 @@ class WebExtension extends LoaderExtension
if (isset($config['profiler'])) {
if ($config['profiler']) {
if (!$container->hasDefinition('profiler')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load('profiling.xml'));
$container->merge($loader->load('collectors.xml'));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load('profiling.xml');
$loader->load('collectors.xml');
}
} elseif ($container->hasDefinition('profiler')) {
$container->getDefinition('profiling')->clearAnnotations();
@ -81,8 +81,8 @@ class WebExtension extends LoaderExtension
if (isset($config['toolbar'])) {
if ($config['toolbar']) {
if (!$container->hasDefinition('debug.toolbar')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load('toolbar.xml'));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load('toolbar.xml');
}
} elseif ($container->hasDefinition('debug.toolbar')) {
$container->getDefinition('debug.toolbar')->clearAnnotations();
@ -92,8 +92,8 @@ class WebExtension extends LoaderExtension
if (isset($config['validation']['enabled'])) {
if ($config['validation']['enabled']) {
if (!$container->hasDefinition('validator')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['validation']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['validation']);
}
$xmlMappingFiles = array();
@ -175,8 +175,8 @@ class WebExtension extends LoaderExtension
public function templatingLoad($config, ContainerBuilder $container)
{
if (!$container->hasDefinition('templating')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['templating']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['templating']);
}
if (array_key_exists('escaping', $config)) {

View File

@ -36,7 +36,7 @@ class FrameworkBundle extends Bundle
*/
public function buildContainer(ParameterBagInterface $parameterBag)
{
Loader::registerExtension(new WebExtension($parameterBag->get('kernel.bundle_dirs'), $parameterBag->get('kernel.bundles')));
ContainerBuilder::registerExtension(new WebExtension($parameterBag->get('kernel.bundle_dirs'), $parameterBag->get('kernel.bundles')));
$dirs = array('%kernel.root_dir%/views/%%bundle%%/%%controller%%/%%name%%%%format%%.%%renderer%%');
foreach ($parameterBag->get('kernel.bundle_dirs') as $dir) {
@ -46,8 +46,8 @@ class FrameworkBundle extends Bundle
$container = new ContainerBuilder();
if ($parameterBag->get('kernel.debug')) {
$loader = new XmlFileLoader(__DIR__.'/Resources/config');
$container->merge($loader->load('debug.xml'));
$loader = new XmlFileLoader($container, __DIR__.'/Resources/config');
$loader->load('debug.xml');
}
return $container;

View File

@ -2,13 +2,13 @@
namespace Symfony\Bundle\PropelBundle\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Reference;
class PropelExtension extends LoaderExtension
class PropelExtension extends Extension
{
protected $resources = array(
'propel' => 'propel.xml',
@ -23,8 +23,8 @@ class PropelExtension extends LoaderExtension
public function configLoad($config, ContainerBuilder $container)
{
if (!$container->hasDefinition('propel')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['propel']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['propel']);
}
if (!$container->hasParameter('propel.path')) {
@ -53,8 +53,8 @@ class PropelExtension extends LoaderExtension
public function dbalLoad($config, ContainerBuilder $container)
{
if (!$container->hasDefinition('propel')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['propel']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['propel']);
}
$defaultConnection = array(

View File

@ -20,7 +20,7 @@ class PropelBundle extends Bundle
*/
public function buildContainer(ParameterBagInterface $parameterBag)
{
Loader::registerExtension(new PropelExtension());
ContainerBuilder::registerExtension(new PropelExtension());
}
public function boot(ContainerInterface $container)

View File

@ -2,7 +2,7 @@
namespace Symfony\Bundle\SwiftmailerBundle\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Reference;
@ -23,7 +23,7 @@ use Symfony\Components\DependencyInjection\Reference;
* @subpackage Bundle_SwiftmailerBundle
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class SwiftMailerExtension extends LoaderExtension
class SwiftMailerExtension extends Extension
{
protected $resources = array(
'mailer' => 'swiftmailer.xml',
@ -46,8 +46,8 @@ class SwiftMailerExtension extends LoaderExtension
public function mailerLoad($config, ContainerBuilder $container)
{
if (!$container->hasDefinition('swiftmailer.mailer')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['mailer']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['mailer']);
$container->setAlias('mailer', 'swiftmailer.mailer');
}

View File

@ -4,6 +4,7 @@ namespace Symfony\Bundle\SwiftmailerBundle;
use Symfony\Framework\Bundle\Bundle;
use Symfony\Components\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Loader\Loader;
use Symfony\Bundle\SwiftmailerBundle\DependencyInjection\SwiftmailerExtension;
@ -34,6 +35,6 @@ class SwiftmailerBundle extends Bundle
*/
public function buildContainer(ParameterBagInterface $parameterBag)
{
Loader::registerExtension(new SwiftmailerExtension());
ContainerBuilder::registerExtension(new SwiftmailerExtension());
}
}

View File

@ -2,7 +2,7 @@
namespace Symfony\Bundle\TwigBundle\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
@ -22,7 +22,7 @@ use Symfony\Components\DependencyInjection\ContainerBuilder;
* @subpackage Bundle_TwigBundle
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class TwigExtension extends LoaderExtension
class TwigExtension extends Extension
{
/**
* Loads the Twig configuration.
@ -33,8 +33,8 @@ class TwigExtension extends LoaderExtension
public function configLoad($config, ContainerBuilder $container)
{
if (!$container->hasDefinition('twig')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load('twig.xml'));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load('twig.xml');
}
$container->setParameter('twig.options', array_replace($container->getParameter('twig.options'), $config));

View File

@ -36,6 +36,6 @@ class TwigBundle extends Bundle
*/
public function buildContainer(ParameterBagInterface $parameterBag)
{
Loader::registerExtension(new TwigExtension());
ContainerBuilder::registerExtension(new TwigExtension());
}
}

View File

@ -2,7 +2,7 @@
namespace Symfony\Bundle\ZendBundle\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
@ -22,7 +22,7 @@ use Symfony\Components\DependencyInjection\ContainerBuilder;
* @subpackage Bundle_ZendBundle
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class ZendExtension extends LoaderExtension
class ZendExtension extends Extension
{
protected $resources = array(
'logger' => 'logger.xml',
@ -41,8 +41,8 @@ class ZendExtension extends LoaderExtension
public function loggerLoad($config, ContainerBuilder $container)
{
if (!$container->hasDefinition('zend.logger')) {
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
$container->merge($loader->load($this->resources['logger']));
$loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
$loader->load($this->resources['logger']);
$container->setAlias('logger', 'zend.logger');
}

View File

@ -6,6 +6,7 @@ use Symfony\Framework\Bundle\Bundle;
use Symfony\Components\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\Loader\Loader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Bundle\ZendBundle\DependencyInjection\ZendExtension;
/*
@ -35,6 +36,6 @@ class ZendBundle extends Bundle
*/
public function buildContainer(ParameterBagInterface $parameterBag)
{
Loader::registerExtension(new ZendExtension());
ContainerBuilder::registerExtension(new ZendExtension());
}
}

View File

@ -2,7 +2,7 @@
namespace Symfony\Components\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtensionInterface;
use Symfony\Components\DependencyInjection\Extension\ExtensionInterface;
use Symfony\Components\DependencyInjection\Resource\ResourceInterface;
use Symfony\Components\DependencyInjection\Resource\FileResource;
@ -24,11 +24,44 @@ use Symfony\Components\DependencyInjection\Resource\FileResource;
*/
class ContainerBuilder extends Container implements AnnotatedContainerInterface
{
protected $definitions = array();
protected $aliases = array();
protected $loading = array();
protected $resources = array();
protected $extensions = array();
static protected $extensions = array();
protected $definitions = array();
protected $aliases = array();
protected $loading = array();
protected $resources = array();
protected $extensionContainers = array();
/**
* Registers an extension.
*
* @param ExtensionInterface $extension An extension instance
*/
static public function registerExtension(ExtensionInterface $extension)
{
static::$extensions[$extension->getAlias()] = static::$extensions[$extension->getNamespace()] = $extension;
}
/**
* Returns an extension by alias or namespace.
*
* @param string $name An alias or a namespace
*
* @return ExtensionInterface An extension instance
*/
static public function getExtension($name)
{
if (!isset(static::$extensions[$name])) {
throw new \LogicException(sprintf('Container extension "%s" is not registered', $name));
}
return static::$extensions[$name];
}
static public function hasExtension($name)
{
return isset(static::$extensions[$name]);
}
/**
* Returns an array of resources loaded to build this configuration.
@ -71,13 +104,13 @@ class ContainerBuilder extends Container implements AnnotatedContainerInterface
/**
* Loads the configuration for an extension.
*
* @param LoaderExtensionInterface $extension A LoaderExtensionInterface instance
* @param ExtensionInterface $extension A ExtensionInterface instance
* @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(LoaderExtensionInterface $extension, $tag, array $values = array())
public function loadFromExtension(ExtensionInterface $extension, $tag, array $values = array())
{
if (true === $this->isFrozen()) {
throw new \LogicException('Cannot load from an extension on a frozen container.');
@ -87,14 +120,14 @@ class ContainerBuilder extends Container implements AnnotatedContainerInterface
$this->addObjectResource($extension);
if (!isset($this->extensions[$namespace])) {
$this->extensions[$namespace] = new self($this->parameterBag);
if (!isset($this->extensionContainers[$namespace])) {
$this->extensionContainers[$namespace] = new self($this->parameterBag);
$r = new \ReflectionObject($extension);
$this->extensions[$namespace]->addResource(new FileResource($r->getFileName()));
$this->extensionContainers[$namespace]->addResource(new FileResource($r->getFileName()));
}
$extension->load($tag, $values, $this->extensions[$namespace]);
$extension->load($tag, $values, $this->extensionContainers[$namespace]);
return $this;
}
@ -204,10 +237,10 @@ class ContainerBuilder extends Container implements AnnotatedContainerInterface
}
foreach ($container->getExtensionContainers() as $name => $container) {
if (isset($this->extensions[$name])) {
$this->extensions[$name]->merge($container);
if (isset($this->extensionContainers[$name])) {
$this->extensionContainers[$name]->merge($container);
} else {
$this->extensions[$name] = $container;
$this->extensionContainers[$name] = $container;
}
}
}
@ -215,11 +248,11 @@ class ContainerBuilder extends Container implements AnnotatedContainerInterface
/**
* Returns the containers for the registered extensions.
*
* @return LoaderExtensionInterface[] An array of extension containers
* @return ExtensionInterface[] An array of extension containers
*/
public function getExtensionContainers()
{
return $this->extensions;
return $this->extensionContainers;
}
/**
@ -238,10 +271,10 @@ class ContainerBuilder extends Container implements AnnotatedContainerInterface
$definitions = $this->definitions;
$aliases = $this->aliases;
foreach ($this->extensions as $container) {
foreach ($this->extensionContainers as $container) {
$this->merge($container);
}
$this->extensions = array();
$this->extensionContainers = array();
$this->addDefinitions($definitions);
$this->addAliases($aliases);

View File

@ -1,6 +1,6 @@
<?php
namespace Symfony\Components\DependencyInjection\Loader;
namespace Symfony\Components\DependencyInjection\Extension;
use Symfony\Components\DependencyInjection\ContainerBuilder;
@ -14,13 +14,13 @@ use Symfony\Components\DependencyInjection\ContainerBuilder;
*/
/**
* LoaderExtension is a helper class that helps organize extensions better.
* Extension is a helper class that helps organize extensions better.
*
* @package Symfony
* @subpackage Components_DependencyInjection
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
abstract class LoaderExtension implements LoaderExtensionInterface
abstract class Extension implements ExtensionInterface
{
/**
* Loads a specific configuration.

View File

@ -1,6 +1,6 @@
<?php
namespace Symfony\Components\DependencyInjection\Loader;
namespace Symfony\Components\DependencyInjection\Extension;
use Symfony\Components\DependencyInjection\ContainerBuilder;
@ -14,13 +14,13 @@ use Symfony\Components\DependencyInjection\ContainerBuilder;
*/
/**
* LoaderExtensionInterface is the interface implemented by loader extension classes.
* ExtensionInterface is the interface implemented by container extension classes.
*
* @package Symfony
* @subpackage Components_DependencyInjection
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
interface LoaderExtensionInterface
interface ExtensionInterface
{
/**
* Loads a specific configuration.

View File

@ -2,6 +2,8 @@
namespace Symfony\Components\DependencyInjection\Loader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
/*
* This file is part of the Symfony framework.
*
@ -25,10 +27,13 @@ abstract class FileLoader extends Loader
/**
* Constructor.
*
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
* @param string|array $paths A path or an array of paths where to look for resources
*/
public function __construct($paths = array())
public function __construct(ContainerBuilder $container, $paths = array())
{
parent::__construct($container);
if (!is_array($paths)) {
$paths = array($paths);
}

View File

@ -27,21 +27,14 @@ class IniFileLoader extends FileLoader
* Loads a resource.
*
* @param mixed $resource The resource
* @param ContainerBuilder $container A ContainerBuilder instance to use for the configuration
*
* @return ContainerBuilder A ContainerBuilder instance
*
* @throws \InvalidArgumentException When ini file is not valid
*/
public function load($file, ContainerBuilder $container = null)
public function load($file)
{
$path = $this->findFile($file);
if (null === $container) {
$container = new ContainerBuilder();
}
$container->addResource(new FileResource($path));
$this->container->addResource(new FileResource($path));
$result = parse_ini_file($path, true);
if (false === $result || array() === $result) {
@ -50,10 +43,8 @@ class IniFileLoader extends FileLoader
if (isset($result['parameters']) && is_array($result['parameters'])) {
foreach ($result['parameters'] as $key => $value) {
$container->setParameter($key, $value);
$this->container->setParameter($key, $value);
}
}
return $container;
}
}

View File

@ -2,6 +2,8 @@
namespace Symfony\Components\DependencyInjection\Loader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
/*
* This file is part of the Symfony framework.
*
@ -20,27 +22,15 @@ namespace Symfony\Components\DependencyInjection\Loader;
*/
abstract class Loader implements LoaderInterface
{
static protected $extensions = array();
protected $container;
/**
* Registers an extension.
* Constructor.
*
* @param LoaderExtensionInterface $extension An extension instance
* @param \Symfony\Components\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance
*/
static public function registerExtension(LoaderExtensionInterface $extension)
public function __construct(ContainerBuilder $container)
{
static::$extensions[$extension->getAlias()] = static::$extensions[$extension->getNamespace()] = $extension;
}
/**
* Returns an extension by alias or namespace.
*
* @param string $name An alias or a namespace
*
* @return LoaderExtensionInterface An extension instance
*/
static public function getExtension($name)
{
return isset(static::$extensions[$name]) ? static::$extensions[$name] : null;
$this->container = $container;
}
}

View File

@ -58,12 +58,7 @@ interface LoaderInterface
* If you load file1.xml and file2.xml in this order, the value of complex
* will be "foo".
*
* @param mixed $resource The resource
* @param ContainerBuilder $container A ContainerBuilder instance to use for the configuration
*
* @return ContainerBuilder A ContainerBuilder instance
* @param mixed $resource The resource
*/
function load($resource, ContainerBuilder $container = null);
static function registerExtension(LoaderExtensionInterface $extension);
function load($resource);
}

View File

@ -29,62 +29,53 @@ class XmlFileLoader extends FileLoader
/**
* Loads an array of XML files.
*
* @param mixed $resource The resource
* @param ContainerBuilder $container A ContainerBuilder instance to use for the configuration
*
* @return ContainerBuilder A ContainerBuilder instance
* @param mixed $resource The resource
*/
public function load($file, ContainerBuilder $container = null)
public function load($file)
{
$path = $this->findFile($file);
$xml = $this->parseFile($path);
if (null === $container) {
$container = new ContainerBuilder();
}
$container->addResource(new FileResource($path));
$this->container->addResource(new FileResource($path));
// anonymous services
$xml = $this->processAnonymousServices($container, $xml, $file);
$xml = $this->processAnonymousServices($xml, $file);
// imports
$this->parseImports($container, $xml, $file);
$this->parseImports($xml, $file);
// extensions
$this->loadFromExtensions($container, $xml);
$this->loadFromExtensions($xml);
// parameters
$this->parseParameters($container, $xml, $file);
$this->parseParameters($xml, $file);
// services
$this->parseDefinitions($container, $xml, $file);
return $container;
$this->parseDefinitions($xml, $file);
}
protected function parseParameters(ContainerBuilder $container, $xml, $file)
protected function parseParameters($xml, $file)
{
if (!$xml->parameters) {
return;
}
$container->getParameterBag()->add($xml->parameters->getArgumentsAsPhp('parameter'));
$this->container->getParameterBag()->add($xml->parameters->getArgumentsAsPhp('parameter'));
}
protected function parseImports(ContainerBuilder $container, $xml, $file)
protected function parseImports($xml, $file)
{
if (!$xml->imports) {
return;
}
foreach ($xml->imports->import as $import) {
$this->parseImport($container, $import, $file);
$this->parseImport($import, $file);
}
}
protected function parseImport(ContainerBuilder $container, $import, $file)
protected function parseImport($import, $file)
{
$class = null;
if (isset($import['class']) && $import['class'] !== get_class($this)) {
@ -101,28 +92,28 @@ class XmlFileLoader extends FileLoader
}
}
$loader = null === $class ? $this : new $class($this->paths);
$loader = null === $class ? $this : new $class($this->container, $this->paths);
$importedFile = $this->getAbsolutePath((string) $import['resource'], dirname($file));
return $loader->load($importedFile, $container);
$loader->load($importedFile);
}
protected function parseDefinitions(ContainerBuilder $container, $xml, $file)
protected function parseDefinitions($xml, $file)
{
if (!$xml->services) {
return;
}
foreach ($xml->services->service as $service) {
$this->parseDefinition($container, (string) $service['id'], $service, $file);
$this->parseDefinition((string) $service['id'], $service, $file);
}
}
protected function parseDefinition(ContainerBuilder $container, $id, $service, $file)
protected function parseDefinition($id, $service, $file)
{
if ((string) $service['alias']) {
$container->setAlias($id, (string) $service['alias']);
$this->container->setAlias($id, (string) $service['alias']);
return;
}
@ -173,7 +164,7 @@ class XmlFileLoader extends FileLoader
$definition->addAnnotation((string) $annotation['name'], $parameters);
}
$container->setDefinition($id, $definition);
$this->container->setDefinition($id, $definition);
}
/**
@ -194,7 +185,7 @@ class XmlFileLoader extends FileLoader
return simplexml_import_dom($dom, 'Symfony\\Components\\DependencyInjection\\SimpleXMLElement');
}
protected function processAnonymousServices(ContainerBuilder $container, $xml, $file)
protected function processAnonymousServices($xml, $file)
{
$definitions = array();
$count = 0;
@ -213,7 +204,7 @@ class XmlFileLoader extends FileLoader
// resolve definitions
krsort($definitions);
foreach ($definitions as $id => $def) {
$this->parseDefinition($container, $id, $def[0], $def[1]);
$this->parseDefinition($id, $def[0], $def[1]);
$oNode = dom_import_simplexml($def[0]);
$oNode->parentNode->removeChild($oNode);
@ -239,7 +230,11 @@ class XmlFileLoader extends FileLoader
if ($element = $dom->documentElement->getAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation')) {
$items = preg_split('/\s+/', $element);
for ($i = 0, $nb = count($items); $i < $nb; $i += 2) {
if (($extension = static::getExtension($items[$i])) && false !== $extension->getXsdValidationBasePath()) {
if (!$this->container->hasExtension($items[$i])) {
continue;
}
if (($extension = $this->container->getExtension($items[$i])) && false !== $extension->getXsdValidationBasePath()) {
$path = str_replace($extension->getNamespace(), str_replace('\\', '/', $extension->getXsdValidationBasePath()).'/', $items[$i + 1]);
if (!file_exists($path)) {
@ -291,7 +286,7 @@ EOF
}
// can it be handled by an extension?
if (!static::getExtension($node->namespaceURI)) {
if (!$this->container->hasExtension($node->namespaceURI)) {
throw new \InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in %s).', $node->tagName, $file));
}
}
@ -316,7 +311,7 @@ EOF
return $errors;
}
protected function loadFromExtensions(ContainerBuilder $container, $xml)
protected function loadFromExtensions($xml)
{
foreach (dom_import_simplexml($xml)->childNodes as $node) {
if (!$node instanceof \DOMElement || $node->namespaceURI === 'http://www.symfony-project.org/schema/dic/services') {
@ -328,7 +323,7 @@ EOF
$values = array();
}
$container->loadFromExtension($this->getExtension($node->namespaceURI), $node->localName, $values);
$this->container->loadFromExtension($this->container->getExtension($node->namespaceURI), $node->localName, $values);
}
}

View File

@ -32,58 +32,49 @@ class YamlFileLoader extends FileLoader
/**
* Loads an array of Yaml files.
*
* @param mixed $resource The resource
* @param ContainerBuilder $container A ContainerBuilder instance to use for the configuration
*
* @return ContainerBuilder A ContainerBuilder instance
* @param mixed $resource The resource
*/
public function load($file, ContainerBuilder $container = null)
public function load($file)
{
$path = $this->findFile($file);
$content = $this->loadFile($path);
if (null === $container) {
$container = new ContainerBuilder();
}
$container->addResource(new FileResource($path));
$this->container->addResource(new FileResource($path));
if (!$content) {
return $container;
return;
}
// imports
$this->parseImports($container, $content, $file);
$this->parseImports($content, $file);
// extensions
$this->loadFromExtensions($container, $content);
$this->loadFromExtensions($content);
// parameters
if (isset($content['parameters'])) {
foreach ($content['parameters'] as $key => $value) {
$container->setParameter($key, $this->resolveServices($value));
$this->container->setParameter($key, $this->resolveServices($value));
}
}
// services
$this->parseDefinitions($container, $content, $file);
return $container;
$this->parseDefinitions($content, $file);
}
protected function parseImports(ContainerBuilder $container, $content, $file)
protected function parseImports($content, $file)
{
if (!isset($content['imports'])) {
return;
}
foreach ($content['imports'] as $import) {
$this->parseImport($container, $import, $file);
$this->parseImport($import, $file);
}
}
protected function parseImport(ContainerBuilder $container, $import, $file)
protected function parseImport($import, $file)
{
$class = null;
if (isset($import['class']) && $import['class'] !== get_class($this)) {
@ -100,28 +91,28 @@ class YamlFileLoader extends FileLoader
}
}
$loader = null === $class ? $this : new $class($this->paths);
$loader = null === $class ? $this : new $class($this->container, $this->paths);
$importedFile = $this->getAbsolutePath($import['resource'], dirname($file));
return $loader->load($importedFile, $container);
$loader->load($importedFile);
}
protected function parseDefinitions(ContainerBuilder $container, $content, $file)
protected function parseDefinitions($content, $file)
{
if (!isset($content['services'])) {
return;
}
foreach ($content['services'] as $id => $service) {
$this->parseDefinition($container, $id, $service, $file);
$this->parseDefinition($id, $service, $file);
}
}
protected function parseDefinition(ContainerBuilder $container, $id, $service, $file)
protected function parseDefinition($id, $service, $file)
{
if (is_string($service) && 0 === strpos($service, '@')) {
$container->setAlias($id, substr($service, 1));
$this->container->setAlias($id, substr($service, 1));
return;
}
@ -175,7 +166,7 @@ class YamlFileLoader extends FileLoader
}
}
$container->setDefinition($id, $definition);
$this->container->setDefinition($id, $definition);
}
protected function loadFile($file)
@ -204,7 +195,7 @@ class YamlFileLoader extends FileLoader
// can it be handled by an extension?
if (false !== strpos($key, '.')) {
list($namespace, $tag) = explode('.', $key);
if (!static::getExtension($namespace)) {
if (!$this->container->hasExtension($namespace)) {
throw new \InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in %s).', $key, $file));
}
@ -230,7 +221,7 @@ class YamlFileLoader extends FileLoader
return $value;
}
protected function loadFromExtensions(ContainerBuilder $container, $content)
protected function loadFromExtensions($content)
{
foreach ($content as $key => $values) {
if (in_array($key, array('imports', 'parameters', 'services'))) {
@ -243,7 +234,7 @@ class YamlFileLoader extends FileLoader
$values = array();
}
$container->loadFromExtension($this->getExtension($namespace), $tag, $values);
$this->container->loadFromExtension($this->container->getExtension($namespace), $tag, $values);
}
}
}

View File

@ -2,7 +2,7 @@
namespace Symfony\Framework\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
@ -22,12 +22,12 @@ use Symfony\Components\DependencyInjection\ContainerBuilder;
* @subpackage Framework
* @author Fabien Potencier <fabien.potencier@symfony-project.org>
*/
class KernelExtension extends LoaderExtension
class KernelExtension extends Extension
{
public function testLoad($config, ContainerBuilder $container)
{
$loader = new XmlFileLoader(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$container->merge($loader->load('test.xml'));
$loader = new XmlFileLoader($container, array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$loader->load('test.xml');
$container->setParameter('kernel.include_core_classes', false);
return $container;
@ -44,8 +44,8 @@ class KernelExtension extends LoaderExtension
public function sessionLoad($config, ContainerBuilder $container)
{
if (!$container->hasDefinition('session')) {
$loader = new XmlFileLoader(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$container->merge($loader->load('session.xml'));
$loader = new XmlFileLoader($container, array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$loader->load('session.xml');
}
if (isset($config['default_locale'])) {

View File

@ -350,7 +350,6 @@ abstract class Kernel implements HttpKernelInterface, \Serializable
}
}
$container->merge($this->registerContainerConfiguration());
$container->commit();
$container->freeze();
foreach (array('cache', 'logs') as $name) {

View File

@ -38,15 +38,15 @@ class KernelBundle extends Bundle
*/
public function buildContainer(ParameterBagInterface $parameterBag)
{
Loader::registerExtension(new KernelExtension());
ContainerBuilder::registerExtension(new KernelExtension());
$container = new ContainerBuilder();
$loader = new XmlFileLoader(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$container->merge($loader->load('services.xml'));
$loader = new XmlFileLoader($container, array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$loader->load('services.xml');
if ($parameterBag->get('kernel.debug')) {
$container->merge($loader->load('debug.xml'));
$loader->load('debug.xml');
$container->setDefinition('event_dispatcher', $container->findDefinition('debug.event_dispatcher'));
}

View File

@ -142,19 +142,19 @@ class KernelBundle extends Bundle
public function buildContainer(ParameterBagInterface $parameterBag)
{
Loader::registerExtension(new KernelExtension());
ContainerBuilder::registerExtension(new KernelExtension());
$configuration = new ContainerBuilder();
$container = new ContainerBuilder();
$loader = new XmlFileLoader(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$configuration->merge($loader->load('services.xml'));
$loader = new XmlFileLoader($container, array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$loader->load('services.xml');
if ($parameterBag->get('kernel.debug')) {
$configuration->merge($loader->load('debug.xml'));
$configuration->setDefinition('event_dispatcher', $configuration->findDefinition('debug.event_dispatcher'));
$loader->load('debug.xml');
$container->setDefinition('event_dispatcher', $container->findDefinition('debug.event_dispatcher'));
}
return $configuration;
return $container;
}
@ -171,43 +171,43 @@ class KernelBundle extends Bundle
namespace Symfony\Framework\DependencyInjection;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
class KernelExtension extends LoaderExtension
class KernelExtension extends Extension
{
public function testLoad($config, ContainerBuilder $configuration)
public function testLoad($config, ContainerBuilder $container)
{
$loader = new XmlFileLoader(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$configuration->merge($loader->load('test.xml'));
$configuration->setParameter('kernel.include_core_classes', false);
$loader = new XmlFileLoader($container, array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$loader->load('test.xml');
$container->setParameter('kernel.include_core_classes', false);
return $configuration;
return $container;
}
public function sessionLoad($config, ContainerBuilder $configuration)
public function sessionLoad($config, ContainerBuilder $container)
{
if (!$configuration->hasDefinition('session')) {
$loader = new XmlFileLoader(array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$configuration->merge($loader->load('session.xml'));
if (!$container->hasDefinition('session')) {
$loader = new XmlFileLoader($container, array(__DIR__.'/../Resources/config', __DIR__.'/Resources/config'));
$loader->load('session.xml');
}
if (isset($config['default_locale'])) {
$configuration->setParameter('session.default_locale', $config['default_locale']);
$container->setParameter('session.default_locale', $config['default_locale']);
}
if (isset($config['class'])) {
$configuration->setParameter('session.class', $config['class']);
$container->setParameter('session.class', $config['class']);
}
foreach (array('name', 'auto_start', 'lifetime', 'path', 'domain', 'secure', 'httponly', 'cache_limiter', 'pdo.db_table') as $name) {
if (isset($config['session'][$name])) {
$configuration->setParameter('session.options.'.$name, $config['session'][$name]);
$container->setParameter('session.options.'.$name, $config['session'][$name]);
}
}
@ -217,16 +217,16 @@ class KernelExtension extends LoaderExtension
$class = 'Symfony\\Framework\\FrameworkBundle\\SessionStorage\\'.$class.'SessionStorage';
}
$configuration->setParameter('session.session', 'session.session.'.strtolower($class));
$container->setParameter('session.session', 'session.session.'.strtolower($class));
}
return $configuration;
return $container;
}
public function configLoad($config, ContainerBuilder $configuration)
public function configLoad($config, ContainerBuilder $container)
{
if (isset($config['charset'])) {
$configuration->setParameter('kernel.charset', $config['charset']);
$container->setParameter('kernel.charset', $config['charset']);
}
if (!array_key_exists('compilation', $config)) {
@ -262,13 +262,13 @@ class KernelExtension extends LoaderExtension
}
}
}
$configuration->setParameter('kernel.compiled_classes', $classes);
$container->setParameter('kernel.compiled_classes', $classes);
if (array_key_exists('error_handler_level', $config)) {
$configuration->setParameter('error_handler.level', $config['error_handler_level']);
$container->setParameter('error_handler.level', $config['error_handler_level']);
}
return $configuration;
return $container;
}

View File

@ -384,4 +384,16 @@ class ContainerBuilderTest extends \PHPUnit_Framework_TestCase
$container->addResource($b = new FileResource(__DIR__.'/Fixtures/xml/services2.xml'));
$this->assertEquals(array($a, $b), $container->getResources(), '->getResources() returns an array of resources read for the current configuration');
}
/**
* @covers Symfony\Components\DependencyInjection\ContainerBuilder::registerExtension
* @covers Symfony\Components\DependencyInjection\ContainerBuilder::getExtension
*/
public function testExtension()
{
$container = new ContainerBuilder();
$container->registerExtension($extension = new \ProjectExtension());
$this->assertTrue($container->getExtension('project') === $extension, '->registerExtension() registers an extension');
}
}

View File

@ -34,15 +34,18 @@ class CrossCheckTest extends \PHPUnit_Framework_TestCase
$tmp = tempnam('sf_service_container', 'sf');
$loader1 = new $loaderClass();
file_put_contents($tmp, file_get_contents(self::$fixturesPath.'/'.$type.'/'.$fixture));
$container1 = $loader1->load($tmp);
$container1 = new ContainerBuilder();
$loader1 = new $loaderClass($container1);
$loader1->load($tmp);
$dumper = new $dumperClass($container1);
file_put_contents($tmp, $dumper->dump());
$loader2 = new $loaderClass();
$container2 = $loader2->load($tmp);
$container2 = new ContainerBuilder();
$loader2 = new $loaderClass($container2);
$loader2->load($tmp);
unlink($tmp);
@ -52,8 +55,6 @@ class CrossCheckTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(serialize($container2), serialize($container1), 'loading a dump from a previously loaded container returns the same container');
$this->assertEquals($container2->getParameterBag()->all(), $container1->getParameterBag()->all(), '->getParameterBag() returns the same value for both containers');
$services1 = array();
foreach ($container1 as $id => $service) {
$services1[$id] = serialize($service);

View File

@ -8,16 +8,16 @@
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Loader;
namespace Symfony\Tests\Components\DependencyInjection\Extension;
require_once __DIR__.'/../Fixtures/includes/ProjectExtension.php';
use Symfony\Components\DependencyInjection\ContainerBuilder;
class LoaderExtensionTest extends \PHPUnit_Framework_TestCase
class ExtensionTest extends \PHPUnit_Framework_TestCase
{
/**
* @covers Symfony\Components\DependencyInjection\Loader\LoaderExtension::load
* @covers Symfony\Components\DependencyInjection\Extension\Extension::load
*/
public function testLoad()
{

View File

@ -2,9 +2,9 @@
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
class ProjectExtension extends LoaderExtension
class ProjectExtension extends Extension
{
public function barLoad(array $config, ContainerBuilder $configuration)
{

View File

@ -2,7 +2,7 @@
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
use Symfony\Components\DependencyInjection\Extension\Extension;
class ProjectWithXsdExtension extends ProjectExtension
{

View File

@ -20,10 +20,10 @@ class FileLoaderTest extends \PHPUnit_Framework_TestCase
*/
public function testConstructor()
{
$loader = new ProjectLoader(__DIR__);
$loader = new ProjectLoader(new ContainerBuilder(), __DIR__);
$this->assertEquals(array(__DIR__), $loader->paths, '__construct() takes a path as its second argument');
$loader = new ProjectLoader(array(__DIR__, __DIR__));
$loader = new ProjectLoader(new ContainerBuilder(), array(__DIR__, __DIR__));
$this->assertEquals(array(__DIR__, __DIR__), $loader->paths, '__construct() takes an array of paths as its second argument');
}
@ -32,7 +32,7 @@ class FileLoaderTest extends \PHPUnit_Framework_TestCase
*/
public function testGetAbsolutePath()
{
$loader = new ProjectLoader(array(__DIR__.'/../Fixtures/containers'));
$loader = new ProjectLoader(new ContainerBuilder(), array(__DIR__.'/../Fixtures/containers'));
$this->assertEquals('/foo.xml', $loader->getAbsolutePath('/foo.xml'), '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$this->assertEquals('c:\\\\foo.xml', $loader->getAbsolutePath('c:\\\\foo.xml'), '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$this->assertEquals('c:/foo.xml', $loader->getAbsolutePath('c:/foo.xml'), '->getAbsolutePath() return the path unmodified if it is already an absolute path');

View File

@ -10,7 +10,7 @@
namespace Symfony\Tests\Components\DependencyInjection\Loader;
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Loader\IniFileLoader;
class IniFileLoaderTest extends \PHPUnit_Framework_TestCase
@ -28,9 +28,10 @@ class IniFileLoaderTest extends \PHPUnit_Framework_TestCase
*/
public function testLoader()
{
$loader = new IniFileLoader(self::$fixturesPath.'/ini');
$config = $loader->load('parameters.ini');
$this->assertEquals(array('foo' => 'bar', 'bar' => '%foo%'), $config->getParameterBag()->all(), '->load() takes a single file name as its first argument');
$container = new ContainerBuilder();
$loader = new IniFileLoader($container, self::$fixturesPath.'/ini');
$loader->load('parameters.ini');
$this->assertEquals(array('foo' => 'bar', 'bar' => '%foo%'), $container->getParameterBag()->all(), '->load() takes a single file name as its first argument');
try {
$loader->load('foo.ini');

View File

@ -1,32 +0,0 @@
<?php
/*
* This file is part of the Symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Loader;
require_once __DIR__.'/../Fixtures/includes/ProjectExtension.php';
use Symfony\Components\DependencyInjection\Loader\Loader;
use Symfony\Components\DependencyInjection\ContainerBuilder;
class ProjectLoader1 extends Loader
{
public function load($resource, ContainerBuilder $container = null)
{
}
}
class LoaderTest extends \PHPUnit_Framework_TestCase
{
public function testExtension()
{
ProjectLoader1::registerExtension($extension = new \ProjectExtension());
$this->assertTrue(ProjectLoader1::getExtension('project') === $extension, '::registerExtension() registers an extension');
}
}

View File

@ -10,7 +10,7 @@
namespace Symfony\Tests\Components\DependencyInjection\Loader;
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Loader\Loader;
@ -29,7 +29,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
public function testLoad()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/ini');
$loader = new ProjectLoader2(new ContainerBuilder(), self::$fixturesPath.'/ini');
try {
$loader->load('foo.xml');
@ -42,7 +42,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
public function testParseFile()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/ini');
$loader = new ProjectLoader2(new ContainerBuilder(), self::$fixturesPath.'/ini');
try {
$loader->parseFile(self::$fixturesPath.'/ini/parameters.ini');
@ -52,7 +52,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
$this->assertStringStartsWith('[ERROR 4] Start tag expected, \'<\' not found (in', $e->getMessage(), '->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
}
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$loader = new ProjectLoader2(new ContainerBuilder(), self::$fixturesPath.'/xml');
try {
$loader->parseFile(self::$fixturesPath.'/xml/nonvalid.xml');
@ -68,10 +68,11 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
public function testLoadParameters()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$config = $loader->load('services2.xml');
$container = new ContainerBuilder();
$loader = new ProjectLoader2($container, self::$fixturesPath.'/xml');
$loader->load('services2.xml');
$actual = $config->getParameterBag()->all();
$actual = $container->getParameterBag()->all();
$expected = array('a string', 'foo' => 'bar', 'values' => array(0, 'integer' => 4, 100 => null, 'true', true, false, 'on', 'off', 'float' => 1.3, 1000.3, 'a string', array('foo', 'bar')), 'foo_bar' => new Reference('foo_bar'));
$this->assertEquals($expected, $actual, '->load() converts XML values to PHP ones');
@ -79,10 +80,11 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
public function testLoadImports()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$config = $loader->load('services4.xml');
$container = new ContainerBuilder();
$loader = new ProjectLoader2($container, self::$fixturesPath.'/xml');
$loader->load('services4.xml');
$actual = $config->getParameterBag()->all();
$actual = $container->getParameterBag()->all();
$expected = array('a string', 'foo' => 'bar', 'values' => array(true, false), 'foo_bar' => new Reference('foo_bar'), 'bar' => '%foo%', 'imported_from_ini' => true, 'imported_from_yaml' => true);
$this->assertEquals(array_keys($expected), array_keys($actual), '->load() imports and merges imported files');
@ -90,9 +92,10 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
public function testLoadAnonymousServices()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$config = $loader->load('services5.xml');
$services = $config->getDefinitions();
$container = new ContainerBuilder();
$loader = new ProjectLoader2($container, self::$fixturesPath.'/xml');
$loader->load('services5.xml');
$services = $container->getDefinitions();
$this->assertEquals(3, count($services), '->load() attributes unique ids to anonymous services');
$args = $services['foo']->getArguments();
$this->assertEquals(1, count($args), '->load() references anonymous services as "normal" ones');
@ -111,9 +114,10 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
public function testLoadServices()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$config = $loader->load('services6.xml');
$services = $config->getDefinitions();
$container = new ContainerBuilder();
$loader = new ProjectLoader2($container, self::$fixturesPath.'/xml');
$loader->load('services6.xml');
$services = $container->getDefinitions();
$this->assertTrue(isset($services['foo']), '->load() parses <service> elements');
$this->assertEquals('Symfony\\Components\\DependencyInjection\\Definition', get_class($services['foo']), '->load() converts <service> element to Definition instances');
$this->assertEquals('FooClass', $services['foo']->getClass(), '->load() parses the class attribute');
@ -129,7 +133,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), $services['method_call2']->getMethodCalls(), '->load() parses the method_call tag');
$this->assertEquals('baz_factory', $services['factory_service']->getFactoryService());
$aliases = $config->getAliases();
$aliases = $container->getAliases();
$this->assertTrue(isset($aliases['alias_for_foo']), '->load() parses <service> elements');
$this->assertEquals('foo', $aliases['alias_for_foo'], '->load() parses aliases');
}
@ -167,15 +171,16 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
public function testExtensions()
{
Loader::registerExtension(new \ProjectExtension());
Loader::registerExtension(new \ProjectWithXsdExtension());
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$container = new ContainerBuilder();
$container->registerExtension(new \ProjectExtension());
$container->registerExtension(new \ProjectWithXsdExtension());
$loader = new ProjectLoader2($container, self::$fixturesPath.'/xml');
// extension without an XSD
$config = $loader->load('extensions/services1.xml');
$config->freeze();
$services = $config->getDefinitions();
$parameters = $config->getParameterBag()->all();
$loader->load('extensions/services1.xml');
$container->freeze();
$services = $container->getDefinitions();
$parameters = $container->getParameterBag()->all();
$this->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
$this->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');
@ -184,10 +189,14 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('BAR', $parameters['project.parameter.foo'], '->load() parses extension elements');
// extension with an XSD
$config = $loader->load('extensions/services2.xml');
$config->freeze();
$services = $config->getDefinitions();
$parameters = $config->getParameterBag()->all();
$container = new ContainerBuilder();
$container->registerExtension(new \ProjectExtension());
$container->registerExtension(new \ProjectWithXsdExtension());
$loader = new ProjectLoader2($container, self::$fixturesPath.'/xml');
$loader->load('extensions/services2.xml');
$container->freeze();
$services = $container->getDefinitions();
$parameters = $container->getParameterBag()->all();
$this->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
$this->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');
@ -195,9 +204,11 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('BAR', $services['project.service.foo']->getClass(), '->load() parses extension elements');
$this->assertEquals('BAR', $parameters['project.parameter.foo'], '->load() parses extension elements');
$loader = new ProjectLoader2(new ContainerBuilder(), self::$fixturesPath.'/xml');
// extension with an XSD (does not validate)
try {
$config = $loader->load('extensions/services3.xml');
$loader->load('extensions/services3.xml');
$this->fail('->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
} catch (\Exception $e) {
$this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the configuration does not validate the XSD');
@ -206,7 +217,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
// non-registered extension
try {
$config = $loader->load('extensions/services4.xml');
$loader->load('extensions/services4.xml');
$this->fail('->load() throws an InvalidArgumentException if the tag is not valid');
} catch (\Exception $e) {
$this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the tag is not valid');
@ -215,7 +226,7 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
// non-existent tag for a known extension
try {
$config = $loader->load('extensions/services5.xml');
$loader->load('extensions/services5.xml');
$this->fail('->load() throws an InvalidArgumentException if a tag is not valid for a given extension');
} catch (\Exception $e) {
$this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if a tag is not valid for a given extension');

View File

@ -10,7 +10,7 @@
namespace Symfony\Tests\Components\DependencyInjection\Loader;
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\ContainerBuilder;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Loader\Loader;
@ -28,7 +28,7 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
public function testLoadFile()
{
$loader = new ProjectLoader3(self::$fixturesPath.'/ini');
$loader = new ProjectLoader3(new ContainerBuilder(), self::$fixturesPath.'/ini');
try {
$loader->loadFile('foo.yml');
@ -46,7 +46,7 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('The service file "parameters.ini" is not valid.', $e->getMessage(), '->load() throws an InvalidArgumentException if the loaded file is not a valid YAML file');
}
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
$loader = new ProjectLoader3(new ContainerBuilder(), self::$fixturesPath.'/yaml');
foreach (array('nonvalid1', 'nonvalid2') as $fixture) {
try {
@ -61,26 +61,29 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
public function testLoadParameters()
{
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
$config = $loader->load('services2.yml');
$this->assertEquals(array('foo' => 'bar', 'values' => array(true, false, 0, 1000.3), 'bar' => 'foo', 'foo_bar' => new Reference('foo_bar')), $config->getParameterBag()->all(), '->load() converts YAML keys to lowercase');
$container = new ContainerBuilder();
$loader = new ProjectLoader3($container, self::$fixturesPath.'/yaml');
$loader->load('services2.yml');
$this->assertEquals(array('foo' => 'bar', 'values' => array(true, false, 0, 1000.3), 'bar' => 'foo', 'foo_bar' => new Reference('foo_bar')), $container->getParameterBag()->all(), '->load() converts YAML keys to lowercase');
}
public function testLoadImports()
{
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
$config = $loader->load('services4.yml');
$container = new ContainerBuilder();
$loader = new ProjectLoader3($container, self::$fixturesPath.'/yaml');
$loader->load('services4.yml');
$actual = $config->getParameterBag()->all();
$actual = $container->getParameterBag()->all();
$expected = array('foo' => 'bar', 'values' => array(true, false), 'bar' => '%foo%', 'foo_bar' => new Reference('foo_bar'), 'imported_from_ini' => true, 'imported_from_xml' => true);
$this->assertEquals(array_keys($expected), array_keys($actual), '->load() imports and merges imported files');
}
public function testLoadServices()
{
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
$config = $loader->load('services6.yml');
$services = $config->getDefinitions();
$container = new ContainerBuilder();
$loader = new ProjectLoader3($container, self::$fixturesPath.'/yaml');
$loader->load('services6.yml');
$services = $container->getDefinitions();
$this->assertTrue(isset($services['foo']), '->load() parses service elements');
$this->assertEquals('Symfony\\Components\\DependencyInjection\\Definition', get_class($services['foo']), '->load() converts service element to Definition instances');
$this->assertEquals('FooClass', $services['foo']->getClass(), '->load() parses the class attribute');
@ -96,20 +99,20 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), $services['method_call2']->getMethodCalls(), '->load() parses the method_call tag');
$this->assertEquals('baz_factory', $services['factory_service']->getFactoryService());
$aliases = $config->getAliases();
$aliases = $container->getAliases();
$this->assertTrue(isset($aliases['alias_for_foo']), '->load() parses aliases');
$this->assertEquals('foo', $aliases['alias_for_foo'], '->load() parses aliases');
}
public function testExtensions()
{
Loader::registerExtension(new \ProjectExtension());
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
$config = $loader->load('services10.yml');
$config->freeze();
$services = $config->getDefinitions();
$parameters = $config->getParameterBag()->all();
$container = new ContainerBuilder();
$container->registerExtension(new \ProjectExtension());
$loader = new ProjectLoader3($container, self::$fixturesPath.'/yaml');
$loader->load('services10.yml');
$container->freeze();
$services = $container->getDefinitions();
$parameters = $container->getParameterBag()->all();
$this->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
$this->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');
@ -118,7 +121,7 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('BAR', $parameters['project.parameter.foo'], '->load() parses extension elements');
try {
$config = $loader->load('services11.yml');
$loader->load('services11.yml');
$this->fail('->load() throws an InvalidArgumentException if the tag is not valid');
} catch (\Exception $e) {
$this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if the tag is not valid');
@ -126,7 +129,7 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
}
try {
$config = $loader->load('services12.yml');
$loader->load('services12.yml');
$this->fail('->load() throws an InvalidArgumentException if an extension is not loaded');
} catch (\Exception $e) {
$this->assertInstanceOf('\InvalidArgumentException', $e, '->load() throws an InvalidArgumentException if an extension is not loaded');