[DependencyInjection] added a way to retrieve loaded resources
This commit is contained in:
parent
e9e2899cda
commit
53980bb55e
@ -23,6 +23,7 @@ class BuilderConfiguration
|
|||||||
protected $definitions = array();
|
protected $definitions = array();
|
||||||
protected $parameters = array();
|
protected $parameters = array();
|
||||||
protected $aliases = array();
|
protected $aliases = array();
|
||||||
|
protected $resources = array();
|
||||||
|
|
||||||
public function __construct(array $definitions = array(), array $parameters = array())
|
public function __construct(array $definitions = array(), array $parameters = array())
|
||||||
{
|
{
|
||||||
@ -30,6 +31,26 @@ class BuilderConfiguration
|
|||||||
$this->setParameters($parameters);
|
$this->setParameters($parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an array of resources loaded to build this configuration.
|
||||||
|
*
|
||||||
|
* @return array An array of resources
|
||||||
|
*/
|
||||||
|
public function getResources()
|
||||||
|
{
|
||||||
|
return $this->resources;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a resource for this configuration.
|
||||||
|
*
|
||||||
|
* @param ResourceInterface $resource A resource instance
|
||||||
|
*/
|
||||||
|
public function addResource(ResourceInterface $resource)
|
||||||
|
{
|
||||||
|
$this->resources[] = $resource;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merges a BuilderConfiguration with the current one.
|
* Merges a BuilderConfiguration with the current one.
|
||||||
*
|
*
|
||||||
@ -45,6 +66,11 @@ class BuilderConfiguration
|
|||||||
$this->addDefinitions($configuration->getDefinitions());
|
$this->addDefinitions($configuration->getDefinitions());
|
||||||
$this->addAliases($configuration->getAliases());
|
$this->addAliases($configuration->getAliases());
|
||||||
$this->addParameters($configuration->getParameters());
|
$this->addParameters($configuration->getParameters());
|
||||||
|
|
||||||
|
foreach ($configuration->getResources() as $resource)
|
||||||
|
{
|
||||||
|
$this->addResource($resource);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
66
src/Symfony/Components/DependencyInjection/FileResource.php
Normal file
66
src/Symfony/Components/DependencyInjection/FileResource.php
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Components\DependencyInjection;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the symfony framework.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
|
||||||
|
*
|
||||||
|
* This source file is subject to the MIT license that is bundled
|
||||||
|
* with this source code in the file LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FileResource represents a resource stored on the filesystem.
|
||||||
|
*
|
||||||
|
* @package symfony
|
||||||
|
* @subpackage dependency_injection
|
||||||
|
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
||||||
|
*/
|
||||||
|
class FileResource implements ResourceInterface
|
||||||
|
{
|
||||||
|
protected $resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor.
|
||||||
|
*
|
||||||
|
* @param string $resource The file path to the resource
|
||||||
|
*/
|
||||||
|
public function __construct($resource)
|
||||||
|
{
|
||||||
|
$this->resource = $resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the resource tied to this Resource.
|
||||||
|
*
|
||||||
|
* @return mixed The resource
|
||||||
|
*/
|
||||||
|
public function getResource()
|
||||||
|
{
|
||||||
|
return $this->resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the resource has not been updated since the given timestamp.
|
||||||
|
*
|
||||||
|
* @param timestamp $timestamp The last time the resource was loaded
|
||||||
|
*
|
||||||
|
* @return Boolean true if the resource has not been updated, false otherwise
|
||||||
|
*/
|
||||||
|
public function isUptodate($timestamp = null)
|
||||||
|
{
|
||||||
|
if (!file_exists($this->resource))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === $timestamp)
|
||||||
|
{
|
||||||
|
$timestamp = time();
|
||||||
|
}
|
||||||
|
|
||||||
|
return filemtime($this->resource) < $timestamp;
|
||||||
|
}
|
||||||
|
}
|
@ -37,6 +37,17 @@ abstract class FileLoader extends Loader
|
|||||||
$this->paths = $paths;
|
$this->paths = $paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function findFile($file)
|
||||||
|
{
|
||||||
|
$path = $this->getAbsolutePath($file);
|
||||||
|
if (!file_exists($path))
|
||||||
|
{
|
||||||
|
throw new \InvalidArgumentException(sprintf('The file "%s" does not exist (in: %s).', $file, implode(', ', $this->paths)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return realpath($path);
|
||||||
|
}
|
||||||
|
|
||||||
protected function getAbsolutePath($file, $currentPath = null)
|
protected function getAbsolutePath($file, $currentPath = null)
|
||||||
{
|
{
|
||||||
if (self::isAbsolutePath($file))
|
if (self::isAbsolutePath($file))
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace Symfony\Components\DependencyInjection\Loader;
|
namespace Symfony\Components\DependencyInjection\Loader;
|
||||||
|
|
||||||
use Symfony\Components\DependencyInjection\BuilderConfiguration;
|
use Symfony\Components\DependencyInjection\BuilderConfiguration;
|
||||||
|
use Symfony\Components\DependencyInjection\FileResource;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file is part of the symfony framework.
|
* This file is part of the symfony framework.
|
||||||
@ -31,13 +32,11 @@ class IniFileLoader extends FileLoader
|
|||||||
*/
|
*/
|
||||||
public function load($file)
|
public function load($file)
|
||||||
{
|
{
|
||||||
|
$path = $this->findFile($file);
|
||||||
|
|
||||||
$configuration = new BuilderConfiguration();
|
$configuration = new BuilderConfiguration();
|
||||||
|
|
||||||
$path = $this->getAbsolutePath($file);
|
$configuration->addResource(new FileResource($path));
|
||||||
if (!file_exists($path))
|
|
||||||
{
|
|
||||||
throw new \InvalidArgumentException(sprintf('The %s file does not exist.', $file));
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = parse_ini_file($path, true);
|
$result = parse_ini_file($path, true);
|
||||||
if (false === $result || array() === $result)
|
if (false === $result || array() === $result)
|
||||||
|
@ -6,6 +6,7 @@ use Symfony\Components\DependencyInjection\Definition;
|
|||||||
use Symfony\Components\DependencyInjection\Reference;
|
use Symfony\Components\DependencyInjection\Reference;
|
||||||
use Symfony\Components\DependencyInjection\BuilderConfiguration;
|
use Symfony\Components\DependencyInjection\BuilderConfiguration;
|
||||||
use Symfony\Components\DependencyInjection\SimpleXMLElement;
|
use Symfony\Components\DependencyInjection\SimpleXMLElement;
|
||||||
|
use Symfony\Components\DependencyInjection\FileResource;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file is part of the symfony framework.
|
* This file is part of the symfony framework.
|
||||||
@ -34,9 +35,13 @@ class XmlFileLoader extends FileLoader
|
|||||||
*/
|
*/
|
||||||
public function load($file)
|
public function load($file)
|
||||||
{
|
{
|
||||||
|
$path = $this->findFile($file);
|
||||||
|
|
||||||
|
$xml = $this->parseFile($path);
|
||||||
|
|
||||||
$configuration = new BuilderConfiguration();
|
$configuration = new BuilderConfiguration();
|
||||||
|
|
||||||
$xml = $this->loadFile($file);
|
$configuration->addResource(new FileResource($path));
|
||||||
|
|
||||||
// anonymous services
|
// anonymous services
|
||||||
$xml = $this->processAnonymousServices($configuration, $xml, $file);
|
$xml = $this->processAnonymousServices($configuration, $xml, $file);
|
||||||
@ -165,25 +170,18 @@ class XmlFileLoader extends FileLoader
|
|||||||
$configuration->setDefinition($id, $definition);
|
$configuration->setDefinition($id, $definition);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function loadFile($file)
|
protected function parseFile($file)
|
||||||
{
|
{
|
||||||
$path = $this->getAbsolutePath($file);
|
|
||||||
|
|
||||||
if (!file_exists($path))
|
|
||||||
{
|
|
||||||
throw new \InvalidArgumentException(sprintf('The service file "%s" does not exist (in: %s).', $file, implode(', ', $this->paths)));
|
|
||||||
}
|
|
||||||
|
|
||||||
$dom = new \DOMDocument();
|
$dom = new \DOMDocument();
|
||||||
libxml_use_internal_errors(true);
|
libxml_use_internal_errors(true);
|
||||||
if (!$dom->load(realpath($path), LIBXML_COMPACT))
|
if (!$dom->load($file, LIBXML_COMPACT))
|
||||||
{
|
{
|
||||||
throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors()));
|
throw new \InvalidArgumentException(implode("\n", $this->getXmlErrors()));
|
||||||
}
|
}
|
||||||
$dom->validateOnParse = true;
|
$dom->validateOnParse = true;
|
||||||
$dom->normalizeDocument();
|
$dom->normalizeDocument();
|
||||||
libxml_use_internal_errors(false);
|
libxml_use_internal_errors(false);
|
||||||
$this->validate($dom, $path);
|
$this->validate($dom, $file);
|
||||||
|
|
||||||
return simplexml_import_dom($dom, 'Symfony\\Components\\DependencyInjection\\SimpleXMLElement');
|
return simplexml_import_dom($dom, 'Symfony\\Components\\DependencyInjection\\SimpleXMLElement');
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ use Symfony\Components\DependencyInjection\Container;
|
|||||||
use Symfony\Components\DependencyInjection\Definition;
|
use Symfony\Components\DependencyInjection\Definition;
|
||||||
use Symfony\Components\DependencyInjection\Reference;
|
use Symfony\Components\DependencyInjection\Reference;
|
||||||
use Symfony\Components\DependencyInjection\BuilderConfiguration;
|
use Symfony\Components\DependencyInjection\BuilderConfiguration;
|
||||||
|
use Symfony\Components\DependencyInjection\FileResource;
|
||||||
use Symfony\Components\YAML\YAML;
|
use Symfony\Components\YAML\YAML;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -37,10 +38,14 @@ class YamlFileLoader extends FileLoader
|
|||||||
*/
|
*/
|
||||||
public function load($file)
|
public function load($file)
|
||||||
{
|
{
|
||||||
$content = $this->loadFile($file);
|
$path = $this->findFile($file);
|
||||||
|
|
||||||
|
$content = $this->loadFile($path);
|
||||||
|
|
||||||
$configuration = new BuilderConfiguration();
|
$configuration = new BuilderConfiguration();
|
||||||
|
|
||||||
|
$configuration->addResource(new FileResource($path));
|
||||||
|
|
||||||
if (!$content)
|
if (!$content)
|
||||||
{
|
{
|
||||||
return $configuration;
|
return $configuration;
|
||||||
@ -166,14 +171,7 @@ class YamlFileLoader extends FileLoader
|
|||||||
|
|
||||||
protected function loadFile($file)
|
protected function loadFile($file)
|
||||||
{
|
{
|
||||||
$path = $this->getAbsolutePath($file);
|
return $this->validate(YAML::load($file), $file);
|
||||||
|
|
||||||
if (!file_exists($path))
|
|
||||||
{
|
|
||||||
throw new \InvalidArgumentException(sprintf('The service file "%s" does not exist (in: %s).', $file, implode(', ', $this->paths)));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->validate(YAML::load($path), $path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function validate($content, $file)
|
protected function validate($content, $file)
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Components\DependencyInjection;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the symfony framework.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
|
||||||
|
*
|
||||||
|
* This source file is subject to the MIT license that is bundled
|
||||||
|
* with this source code in the file LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ResourceInterface is the interface that must be implemented by all Resource classes.
|
||||||
|
*
|
||||||
|
* @package symfony
|
||||||
|
* @subpackage dependency_injection
|
||||||
|
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
||||||
|
*/
|
||||||
|
interface ResourceInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns true if the resource has not been updated since the given timestamp.
|
||||||
|
*
|
||||||
|
* @param timestamp $timestamp The last time the resource was loaded
|
||||||
|
*
|
||||||
|
* @return Boolean true if the resource has not been updated, false otherwise
|
||||||
|
*/
|
||||||
|
function isUptodate($timestamp = null);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the resource tied to this Resource.
|
||||||
|
*
|
||||||
|
* @return mixed The resource
|
||||||
|
*/
|
||||||
|
function getResource();
|
||||||
|
}
|
@ -14,10 +14,11 @@ use Symfony\Components\DependencyInjection\Builder;
|
|||||||
use Symfony\Components\DependencyInjection\BuilderConfiguration;
|
use Symfony\Components\DependencyInjection\BuilderConfiguration;
|
||||||
use Symfony\Components\DependencyInjection\Definition;
|
use Symfony\Components\DependencyInjection\Definition;
|
||||||
use Symfony\Components\DependencyInjection\Reference;
|
use Symfony\Components\DependencyInjection\Reference;
|
||||||
|
use Symfony\Components\DependencyInjection\FileResource;
|
||||||
|
|
||||||
$fixturesPath = __DIR__.'/../../../../fixtures/Symfony/Components/DependencyInjection/';
|
$fixturesPath = __DIR__.'/../../../../fixtures/Symfony/Components/DependencyInjection/';
|
||||||
|
|
||||||
$t = new LimeTest(37);
|
$t = new LimeTest(39);
|
||||||
|
|
||||||
// __construct()
|
// __construct()
|
||||||
$t->diag('__construct()');
|
$t->diag('__construct()');
|
||||||
@ -62,6 +63,13 @@ $config->setDefinition('foo', new Definition('BazClass'));
|
|||||||
$configuration->merge($config);
|
$configuration->merge($config);
|
||||||
$t->is($configuration->getDefinition('foo')->getClass(), 'BazClass', '->merge() overrides already defined services');
|
$t->is($configuration->getDefinition('foo')->getClass(), 'BazClass', '->merge() overrides already defined services');
|
||||||
|
|
||||||
|
$configuration = new BuilderConfiguration();
|
||||||
|
$configuration->addResource($a = new FileResource('foo.xml'));
|
||||||
|
$config = new BuilderConfiguration();
|
||||||
|
$config->addResource($b = new FileResource('foo.yml'));
|
||||||
|
$configuration->merge($config);
|
||||||
|
$t->is($configuration->getResources(), array($a, $b), '->merge() merges resources');
|
||||||
|
|
||||||
// ->setParameters() ->getParameters()
|
// ->setParameters() ->getParameters()
|
||||||
$t->diag('->setParameters() ->getParameters()');
|
$t->diag('->setParameters() ->getParameters()');
|
||||||
|
|
||||||
@ -175,3 +183,10 @@ $configuration = new BuilderConfiguration(array('foo' => $definition = new Defin
|
|||||||
$configuration->setAlias('bar', 'foo');
|
$configuration->setAlias('bar', 'foo');
|
||||||
$configuration->setAlias('foobar', 'bar');
|
$configuration->setAlias('foobar', 'bar');
|
||||||
$t->is($configuration->findDefinition('foobar'), $definition, '->findDefinition() returns a Definition');
|
$t->is($configuration->findDefinition('foobar'), $definition, '->findDefinition() returns a Definition');
|
||||||
|
|
||||||
|
// ->addResource() ->getResources()
|
||||||
|
$t->diag('->addResource() ->getResources()');
|
||||||
|
$configuration = new BuilderConfiguration();
|
||||||
|
$configuration->addResource($a = new FileResource('foo.xml'));
|
||||||
|
$configuration->addResource($b = new FileResource('foo.yml'));
|
||||||
|
$t->is($configuration->getResources(), array($a, $b), '->getResources() returns an array of resources read for the current configuration');
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
<?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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require_once __DIR__.'/../../../bootstrap.php';
|
||||||
|
|
||||||
|
use Symfony\Components\DependencyInjection\FileResource;
|
||||||
|
|
||||||
|
$t = new LimeTest(5);
|
||||||
|
|
||||||
|
// ->getResource()
|
||||||
|
$t->diag('->getResource()');
|
||||||
|
$file = sys_get_temp_dir().'/tmp.xml';
|
||||||
|
touch($file);
|
||||||
|
$resource = new FileResource($file);
|
||||||
|
$t->is($resource->getResource(), $file, '->getResource() returns the path to the resource');
|
||||||
|
|
||||||
|
// ->isUptodate()
|
||||||
|
$t->diag('->isUptodate()');
|
||||||
|
sleep(1);
|
||||||
|
$t->ok($resource->isUptodate(), '->isUptodate() returns true if the resource has not changed');
|
||||||
|
$t->ok($resource->isUptodate(time() + 10), '->isUptodate() returns true if the resource has not changed');
|
||||||
|
$t->ok(!$resource->isUptodate(time() - 86400), '->isUptodate() returns false if the resource has been updated');
|
||||||
|
unlink($file);
|
||||||
|
|
||||||
|
$resource = new FileResource('/____foo/foobar'.rand(1, 999999));
|
||||||
|
$t->ok(!$resource->isUptodate(), '->isUptodate() returns false if the resource does not exist');
|
@ -24,20 +24,20 @@ require_once $fixturesPath.'/includes/ProjectExtension.php';
|
|||||||
|
|
||||||
class ProjectLoader extends XmlFileLoader
|
class ProjectLoader extends XmlFileLoader
|
||||||
{
|
{
|
||||||
public function loadFile($file)
|
public function parseFile($file)
|
||||||
{
|
{
|
||||||
return parent::loadFile($file);
|
return parent::parseFile($file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ->loadFile()
|
// ->load()
|
||||||
$t->diag('->loadFile()');
|
$t->diag('->load()');
|
||||||
|
|
||||||
$loader = new ProjectLoader($fixturesPath.'/ini');
|
$loader = new ProjectLoader($fixturesPath.'/ini');
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$loader->loadFile('foo.xml');
|
$loader->load('foo.xml');
|
||||||
$t->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
|
$t->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
|
||||||
}
|
}
|
||||||
catch (InvalidArgumentException $e)
|
catch (InvalidArgumentException $e)
|
||||||
@ -45,30 +45,33 @@ catch (InvalidArgumentException $e)
|
|||||||
$t->pass('->load() throws an InvalidArgumentException if the loaded file does not exist');
|
$t->pass('->load() throws an InvalidArgumentException if the loaded file does not exist');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ->parseFile()
|
||||||
|
$t->diag('->parseFile()');
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$loader->loadFile('parameters.ini');
|
$loader->parseFile($fixturesPath.'/ini/parameters.ini');
|
||||||
$t->fail('->load() throws an InvalidArgumentException if the loaded file is not a valid XML file');
|
$t->fail('->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
|
||||||
}
|
}
|
||||||
catch (InvalidArgumentException $e)
|
catch (InvalidArgumentException $e)
|
||||||
{
|
{
|
||||||
$t->pass('->load() throws an InvalidArgumentException if the loaded file is not a valid XML file');
|
$t->pass('->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
|
||||||
}
|
}
|
||||||
|
|
||||||
$loader = new ProjectLoader($fixturesPath.'/xml');
|
$loader = new ProjectLoader($fixturesPath.'/xml');
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$loader->loadFile('nonvalid.xml');
|
$loader->parseFile($fixturesPath.'/xml/nonvalid.xml');
|
||||||
$t->fail('->load() throws an InvalidArgumentException if the loaded file does not validate the XSD');
|
$t->fail('->parseFile() throws an InvalidArgumentException if the loaded file does not validate the XSD');
|
||||||
}
|
}
|
||||||
catch (InvalidArgumentException $e)
|
catch (InvalidArgumentException $e)
|
||||||
{
|
{
|
||||||
$t->pass('->load() throws an InvalidArgumentException if the loaded file does not validate the XSD');
|
$t->pass('->parseFile() throws an InvalidArgumentException if the loaded file does not validate the XSD');
|
||||||
}
|
}
|
||||||
|
|
||||||
$xml = $loader->loadFile('services1.xml');
|
$xml = $loader->parseFile($fixturesPath.'/xml/services1.xml');
|
||||||
$t->is(get_class($xml), 'Symfony\\Components\\DependencyInjection\\SimpleXMLElement', '->loadFile() returns an SimpleXMLElement object');
|
$t->is(get_class($xml), 'Symfony\\Components\\DependencyInjection\\SimpleXMLElement', '->parseFile() returns an SimpleXMLElement object');
|
||||||
|
|
||||||
// ->load() # parameters
|
// ->load() # parameters
|
||||||
$t->diag('->load() # parameters');
|
$t->diag('->load() # parameters');
|
||||||
|
Reference in New Issue
Block a user