diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractConfigurator.php index 2c4538e201..73ca320e31 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractConfigurator.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractConfigurator.php @@ -22,6 +22,9 @@ abstract class AbstractConfigurator { const FACTORY = 'unknown'; + /** @internal */ + protected $definition; + public function __call($method, $args) { if (method_exists($this, 'set'.$method)) { @@ -37,7 +40,7 @@ abstract class AbstractConfigurator * @param mixed $value * @param bool $allowServices whether Definition and Reference are allowed; by default, only scalars and arrays are * - * @return mixed the value, optionaly cast to a Definition/Reference + * @return mixed the value, optionally cast to a Definition/Reference */ public static function processValue($value, $allowServices = false) { @@ -50,32 +53,14 @@ abstract class AbstractConfigurator } if ($value instanceof ReferenceConfigurator) { - static $refCast; - - if (!$refCast) { - $refCast = \Closure::bind(function ($value) { - return new Reference($value->id, $value->invalidBehavior); - }, null, $value); - } - - // cast ReferenceConfigurator to Reference - return $refCast($value); + return new Reference($value->id, $value->invalidBehavior); } if ($value instanceof InlineServiceConfigurator) { - static $defCast; + $def = $value->definition; + $value->definition = null; - if (!$defCast) { - $defCast = \Closure::bind(function ($value) { - $def = $value->definition; - $value->definition = null; - - return $def; - }, null, $value); - } - - // cast InlineServiceConfigurator to Definition - return $defCast($value); + return $def; } if ($value instanceof self) { diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractServiceConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractServiceConfigurator.php index 72ca7320b9..40b6c2f389 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractServiceConfigurator.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/AbstractServiceConfigurator.php @@ -17,9 +17,8 @@ use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; abstract class AbstractServiceConfigurator extends AbstractConfigurator { protected $parent; - protected $definition; protected $id; - protected $defaultTags = array(); + private $defaultTags = array(); public function __construct(ServicesConfigurator $parent, Definition $definition, $id = null, array $defaultTags = array()) { @@ -59,7 +58,7 @@ abstract class AbstractServiceConfigurator extends AbstractConfigurator * Creates an alias. * * @param string $id - * @param string $ref + * @param string $referencedId * * @return AliasConfigurator */ diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ReferenceConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ReferenceConfigurator.php index 93fdf3960e..1585c0872a 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ReferenceConfigurator.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ReferenceConfigurator.php @@ -16,10 +16,13 @@ use Symfony\Component\DependencyInjection\ContainerInterface; /** * @author Nicolas Grekas */ -class ReferenceConfigurator +class ReferenceConfigurator extends AbstractConfigurator { - private $id; - private $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; + /** @internal */ + protected $id; + + /** @internal */ + protected $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; public function __construct($id) { diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/AbstractTrait.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/AbstractTrait.php index 47e0dee287..f69a7a5be1 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/AbstractTrait.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/AbstractTrait.php @@ -11,8 +11,6 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; -use Symfony\Component\DependencyInjection\Definition; - /** * @method $this abstract(bool $abstract = true) */ diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/AutoconfigureTrait.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/AutoconfigureTrait.php index e3dccc9656..42a692353e 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/AutoconfigureTrait.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/AutoconfigureTrait.php @@ -11,6 +11,7 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; +use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; trait AutoconfigureTrait diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/DeprecateTrait.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/DeprecateTrait.php index 331be473e2..b14a6557ee 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/DeprecateTrait.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/DeprecateTrait.php @@ -11,7 +11,6 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; -use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; trait DeprecateTrait diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/TagTrait.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/TagTrait.php index 4094acdbfc..aeb8b047d4 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/TagTrait.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/Traits/TagTrait.php @@ -11,7 +11,6 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator\Traits; -use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; trait TagTrait diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/services_autoconfigure_with_parent.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/services_autoconfigure_with_parent.php new file mode 100644 index 0000000000..f8ffb1dee9 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/services_autoconfigure_with_parent.php @@ -0,0 +1,9 @@ +services() + ->set('parent_service', \stdClass::class) + ->set('child_service')->parent('parent_service')->autoconfigure(true); +}; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php index 02f84311e6..a8f10d9ef0 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php @@ -76,4 +76,17 @@ class PhpFileLoaderTest extends TestCase yield array('php7'); } } + + /** + * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException + * @expectedExceptionMessage The service "child_service" cannot have a "parent" and also have "autoconfigure". Try disabling autoconfiguration for the service. + */ + public function testAutoConfigureAndChildDefinitionNotAllowed() + { + $fixtures = realpath(__DIR__.'/../Fixtures'); + $container = new ContainerBuilder(); + $loader = new PhpFileLoader($container, new FileLocator()); + $loader->load($fixtures.'/config/services_autoconfigure_with_parent.php'); + $container->compile(); + } }