diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index 1e1619b811..220d543673 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -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); diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php index 66658efdeb..ebb7ce28a1 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php @@ -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 */