[DependencyInjection] fixed setting a synthetic service on a frozen container

This commit is contained in:
Fabien Potencier 2012-12-28 09:42:17 +01:00
parent 35f5bca585
commit 3cac604352
2 changed files with 34 additions and 1 deletions

View File

@ -311,7 +311,10 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
public function set($id, $service, $scope = self::SCOPE_CONTAINER)
{
if ($this->isFrozen()) {
throw new BadMethodCallException('Setting service on a frozen container is not allowed');
// setting a synthetic service on a frozen container is alright
if (!isset($this->definitions[$id]) || !$this->definitions[$id]->isSynthetic()) {
throw new BadMethodCallException('Setting service on a frozen container is not allowed');
}
}
$id = strtolower($id);

View File

@ -531,10 +531,40 @@ class ContainerBuilderTest extends \PHPUnit_Framework_TestCase
}
$container = new ContainerBuilder();
$container->setDefinition('a', new Definition('stdClass'));
$container->compile();
$container->set('a', new \stdClass());
}
/**
* @expectedException BadMethodCallException
*/
public function testThrowsExceptionWhenAddServiceOnAFrozenContainer()
{
if (!class_exists('Symfony\Component\Config\Resource\FileResource')) {
$this->markTestSkipped('The "Config" component is not available');
}
$container = new ContainerBuilder();
$container->compile();
$container->set('a', new \stdClass());
}
public function testNoExceptionWhenSetSyntheticServiceOnAFrozenContainer()
{
if (!class_exists('Symfony\Component\Config\Resource\FileResource')) {
$this->markTestSkipped('The "Config" component is not available');
}
$container = new ContainerBuilder();
$def = new Definition('stdClass');
$def->setSynthetic(true);
$container->setDefinition('a', $def);
$container->compile();
$container->set('a', $a = new \stdClass());
$this->assertEquals($a, $container->get('a'));
}
/**
* @expectedException BadMethodCallException
*/