From 09f5bc5674b6544f2b017498bd45363a340944ee Mon Sep 17 00:00:00 2001 From: Roland Franssen Date: Sat, 20 May 2017 17:39:55 +0200 Subject: [PATCH] [DI] Mark service_container a private service --- .../Tests/Controller/AbstractControllerTest.php | 2 +- .../DependencyInjection/WebProfilerExtensionTest.php | 3 +++ .../Compiler/CheckDefinitionValidityPass.php | 2 +- .../Compiler/InlineServiceDefinitionsPass.php | 4 ++++ .../Component/DependencyInjection/Container.php | 10 ++++++++-- .../Component/DependencyInjection/ContainerBuilder.php | 8 ++++---- .../DependencyInjection/Dumper/GraphvizDumper.php | 6 ++++-- .../DependencyInjection/Tests/ContainerBuilderTest.php | 1 + .../DependencyInjection/Tests/ContainerTest.php | 7 +++++++ .../DependencyInjection/Tests/CrossCheckTest.php | 2 -- .../DependencyInjection/Tests/Dumper/XmlDumperTest.php | 8 ++++---- .../Tests/Fixtures/graphviz/services13.dot | 1 - .../Tests/Fixtures/php/services13.php | 3 +++ .../Tests/Fixtures/php/services9.php | 1 + .../Tests/Fixtures/php/services9_compiled.php | 3 +++ .../Tests/Fixtures/xml/services1.xml | 2 +- .../Tests/Fixtures/xml/services2.xml | 5 +++++ .../Tests/Fixtures/xml/services21.xml | 2 +- .../Tests/Fixtures/xml/services24.xml | 2 +- .../Tests/Fixtures/xml/services6.xml | 3 +++ .../Tests/Fixtures/xml/services8.xml | 2 +- .../Tests/Fixtures/xml/services9.xml | 2 +- .../Tests/Fixtures/yaml/services1.yml | 1 + .../Tests/Fixtures/yaml/services24.yml | 1 + .../Tests/Fixtures/yaml/services8.yml | 1 + .../Tests/Fixtures/yaml/services9.yml | 1 + .../Tests/Loader/XmlFileLoaderTest.php | 3 --- 27 files changed, 61 insertions(+), 25 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/AbstractControllerTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/AbstractControllerTest.php index 937cbfc7286d0..90a80fb3cc89a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/AbstractControllerTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/AbstractControllerTest.php @@ -43,7 +43,7 @@ public function setContainer(ContainerInterface $container) $expected = self::getSubscribedServices(); foreach ($container->getServiceIds() as $id) { - if ('service_container' === $id) { + if ('service_container' === $id) { // to be removed in 4.0 continue; } if (!isset($expected[$id])) { diff --git a/src/Symfony/Bundle/WebProfilerBundle/Tests/DependencyInjection/WebProfilerExtensionTest.php b/src/Symfony/Bundle/WebProfilerBundle/Tests/DependencyInjection/WebProfilerExtensionTest.php index b5a9b53e5dbdc..a9716fb169658 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Tests/DependencyInjection/WebProfilerExtensionTest.php +++ b/src/Symfony/Bundle/WebProfilerBundle/Tests/DependencyInjection/WebProfilerExtensionTest.php @@ -31,6 +31,9 @@ public static function assertSaneContainer(Container $container, $message = '') { $errors = array(); foreach ($container->getServiceIds() as $id) { + if ('service_container' === $id) { // to be removed in 4.0 + continue; + } try { $container->get($id); } catch (\Exception $e) { diff --git a/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php b/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php index a43e0cd78f404..6dab4cc105801 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php @@ -39,7 +39,7 @@ public function process(ContainerBuilder $container) { foreach ($container->getDefinitions() as $id => $definition) { // synthetic service is public - if ($definition->isSynthetic() && !$definition->isPublic()) { + if ($definition->isSynthetic() && !$definition->isPublic() && 'service_container' !== $id) { throw new RuntimeException(sprintf('A synthetic service ("%s") must be public.', $id)); } diff --git a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php index cec68cbb573a1..c78bc6dc9f9ed 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php @@ -64,6 +64,10 @@ protected function processValue($value, $isRoot = false) */ private function isInlineableDefinition($id, Definition $definition, ServiceReferenceGraph $graph) { + if ('service_container' === $id) { + return false; + } + if (!$definition->isShared()) { return true; } diff --git a/src/Symfony/Component/DependencyInjection/Container.php b/src/Symfony/Component/DependencyInjection/Container.php index 05e038ac5cb63..565c166ca5f33 100644 --- a/src/Symfony/Component/DependencyInjection/Container.php +++ b/src/Symfony/Component/DependencyInjection/Container.php @@ -189,7 +189,7 @@ public function set($id, $service) $id = $this->normalizeId($id); if ('service_container' === $id) { - throw new InvalidArgumentException('You cannot set service "service_container".'); + throw new InvalidArgumentException('You cannot set the private service "service_container".'); } if (isset($this->aliases[$id])) { @@ -229,6 +229,8 @@ public function has($id) { for ($i = 2;;) { if ('service_container' === $id) { + @trigger_error('Checking for the existence of the "service_container" private service is deprecated since Symfony 3.4 and won\'t be supported anymore in Symfony 4.0.', E_USER_DEPRECATED); + return true; } if (isset($this->aliases[$id])) { @@ -288,6 +290,8 @@ public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE // calling $this->normalizeId($id) unless necessary. for ($i = 2;;) { if ('service_container' === $id) { + @trigger_error('Requesting the "service_container" private service is deprecated since Symfony 3.4 and won\'t be supported anymore in Symfony 4.0.', E_USER_DEPRECATED); + return $this; } if (isset($this->aliases[$id])) { @@ -363,6 +367,8 @@ public function initialized($id) $id = $this->normalizeId($id); if ('service_container' === $id) { + @trigger_error('Checking for the initialization of the "service_container" private service is deprecated since Symfony 3.4 and won\'t be supported anymore in Symfony 4.0.', E_USER_DEPRECATED); + return false; } @@ -401,7 +407,7 @@ public function getServiceIds() } } } - $ids[] = 'service_container'; + $ids[] = 'service_container'; // to be removed in 4.0 return array_unique(array_merge($ids, array_keys($this->methodMap), array_keys($this->services))); } diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index 0a2d673c789df..438fc82e44873 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -126,7 +126,7 @@ public function __construct(ParameterBagInterface $parameterBag = null) parent::__construct($parameterBag); $this->trackResources = interface_exists('Symfony\Component\Config\Resource\ResourceInterface'); - $this->setDefinition('service_container', (new Definition(ContainerInterface::class))->setSynthetic(true)); + $this->setDefinition('service_container', (new Definition(ContainerInterface::class))->setSynthetic(true)->setPublic(false)); $this->setAlias(PsrContainerInterface::class, new Alias('service_container', false)); $this->setAlias(ContainerInterface::class, new Alias('service_container', false)); } @@ -1104,7 +1104,7 @@ private function createService(Definition $definition, $id, $tryProxy = true) $callable[0] = $parameterBag->resolveValue($callable[0]); if ($callable[0] instanceof Reference) { - $callable[0] = $this->get((string) $callable[0], $callable[0]->getInvalidBehavior()); + $callable[0] = 'service_container' === (string) $callable[0] ? $this : $this->get((string) $callable[0], $callable[0]->getInvalidBehavior()); } elseif ($callable[0] instanceof Definition) { $callable[0] = $this->createService($callable[0], null); } @@ -1187,10 +1187,10 @@ public function resolveServices($value) } } $value = function () use ($id, $method) { - return call_user_func_array(array($this->get($id), $method), func_get_args()); + return call_user_func_array(array('service_container' === $id ? $this : $this->get($id), $method), func_get_args()); }; } elseif ($value instanceof Reference) { - $value = $this->get((string) $value, $value->getInvalidBehavior()); + $value = 'service_container' === (string) $value ? $this : $this->get((string) $value, $value->getInvalidBehavior()); } elseif ($value instanceof Definition) { $value = $this->createService($value, null); } elseif ($value instanceof Expression) { diff --git a/src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php index 9a20525f626c0..a207610adaca3 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/GraphvizDumper.php @@ -187,13 +187,15 @@ private function findNodes() } foreach ($container->getServiceIds() as $id) { + if ('service_container' === $id) { // to be removed in 4.0 + continue; + } if (array_key_exists($id, $container->getAliases())) { continue; } if (!$container->hasDefinition($id)) { - $class = get_class('service_container' === $id ? $this->container : $container->get($id)); - $nodes[$id] = array('class' => str_replace('\\', '\\\\', $class), 'attributes' => $this->options['node.instance']); + $nodes[$id] = array('class' => str_replace('\\', '\\\\', get_class($container->get($id))), 'attributes' => $this->options['node.instance']); } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php index 3558c7bd226e1..087757af9119a 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php @@ -54,6 +54,7 @@ public function testDefaultRegisteredDefinitions() $definition = $builder->getDefinition('service_container'); $this->assertInstanceOf(Definition::class, $definition); $this->assertTrue($definition->isSynthetic()); + $this->assertFalse($definition->isPublic()); $this->assertSame(ContainerInterface::class, $definition->getClass()); $this->assertTrue($builder->hasAlias(PsrContainerInterface::class)); $this->assertTrue($builder->hasAlias(ContainerInterface::class)); diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerTest.php index 99419201c6389..de10b3da7de2c 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/ContainerTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/ContainerTest.php @@ -20,11 +20,18 @@ class ContainerTest extends TestCase { + /** + * @group legacy + * @expectedDeprecation Requesting the "service_container" private service is deprecated since Symfony 3.4 and won't be supported anymore in Symfony 4.0. + */ public function testConstructor() { $sc = new Container(); $this->assertSame($sc, $sc->get('service_container'), '__construct() automatically registers itself as a service'); + } + public function testConstructorWithParameters() + { $sc = new Container(new ParameterBag(array('foo' => 'bar'))); $this->assertEquals(array('foo' => 'bar'), $sc->getParameterBag()->all(), '__construct() takes an array of parameters as its first argument'); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php b/src/Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php index bcfe88acc0ce4..e386bf7ad90d2 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/CrossCheckTest.php @@ -72,8 +72,6 @@ public function testCrossCheck($fixture, $type) $services2[$id] = serialize($service); } - unset($services1['service_container'], $services2['service_container']); - $this->assertEquals($services2, $services1, 'Iterator on the containers returns the same services'); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php index 9b2ff54770b9f..7241550e200a5 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php @@ -70,7 +70,7 @@ public function testDumpAnonymousServices() $this->assertEquals(' - + @@ -94,7 +94,7 @@ public function testDumpEntities() $this->assertEquals(" - + foo<>&bar @@ -123,7 +123,7 @@ public function provideDecoratedServicesData() array(" - + @@ -133,7 +133,7 @@ public function provideDecoratedServicesData() array(" - + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot index fffe8f1b54743..c9e71f68dac05 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/graphviz/services13.dot @@ -3,7 +3,6 @@ digraph sc { node [fontsize="11" fontname="Arial" shape="record"]; edge [fontsize="9" fontname="Arial" color="grey" arrowhead="open" arrowsize="0.5"]; - node_service_container [label="service_container\nSymfony\\Component\\DependencyInjection\\ContainerInterface\n", shape=record, fillcolor="#eeeeee", style="filled"]; node_foo [label="foo\nFooClass\n", shape=record, fillcolor="#eeeeee", style="filled"]; node_bar [label="bar\nBarClass\n", shape=record, fillcolor="#eeeeee", style="filled"]; node_foo -> node_bar [label="" style="filled"]; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services13.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services13.php index 1cffb23b7b878..dad1f2f42b3d8 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services13.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services13.php @@ -30,6 +30,9 @@ public function __construct() $this->methodMap = array( 'bar' => 'getBarService', ); + $this->privates = array( + 'service_container' => true, + ); $this->aliases = array(); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php index b8d5aeafacf24..c1157fd3d754e 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9.php @@ -64,6 +64,7 @@ public function __construct() 'factory_simple' => true, 'inlined' => true, 'new_factory' => true, + 'service_container' => true, ); $this->aliases = array( 'Psr\\Container\\ContainerInterface' => 'service_container', diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php index a519cece6e297..504535f7b131a 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_compiled.php @@ -50,6 +50,9 @@ public function __construct() 'new_factory_service' => 'getNewFactoryServiceService', 'service_from_static_method' => 'getServiceFromStaticMethodService', ); + $this->privates = array( + 'service_container' => true, + ); $this->aliases = array( 'alias_for_alias' => 'foo', 'alias_for_foo' => 'foo', diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xml index fd7bb3cf9b080..823fc4d0998d5 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services1.xml @@ -1,7 +1,7 @@ - + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xml index f1ac14dd5d343..f237a053d3fa0 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services2.xml @@ -28,4 +28,9 @@ PHP_EOL + + + + + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services21.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services21.xml index 2ed88fee5a0d4..a3037be0f9de1 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services21.xml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services21.xml @@ -1,7 +1,7 @@ - + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services24.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services24.xml index c4e32cb634e0c..50dde20c6d794 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services24.xml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services24.xml @@ -1,7 +1,7 @@ - + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xml index 5134ff7671f11..75b486f8bc17c 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services6.xml @@ -4,6 +4,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> + + + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml index 533d2a38d765e..9b744115dc84b 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml @@ -20,7 +20,7 @@ - + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml index 79fdff4c4e2d0..7209853bb9824 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services9.xml @@ -6,7 +6,7 @@ bar - + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.yml index 7b0d3dc697852..7297271be059d 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services1.yml @@ -1,6 +1,7 @@ services: service_container: class: Symfony\Component\DependencyInjection\ContainerInterface + public: false synthetic: true Psr\Container\ContainerInterface: alias: service_container diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services24.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services24.yml index afed157017f4d..867013e51394e 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services24.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services24.yml @@ -2,6 +2,7 @@ services: service_container: class: Symfony\Component\DependencyInjection\ContainerInterface + public: false synthetic: true foo: class: Foo diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml index 9efdf3e0d4d0a..c104a54364175 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml @@ -8,6 +8,7 @@ parameters: services: service_container: class: Symfony\Component\DependencyInjection\ContainerInterface + public: false synthetic: true Psr\Container\ContainerInterface: alias: service_container diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml index bfee29fb605e5..a9ef048166b32 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services9.yml @@ -6,6 +6,7 @@ parameters: services: service_container: class: Symfony\Component\DependencyInjection\ContainerInterface + public: false synthetic: true foo: class: Bar\FooClass diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php index 41d1c48d54bcc..68ce44e911b60 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php @@ -664,9 +664,6 @@ public function testDefaults() $this->assertFalse($container->getDefinition('child_def')->isAutowired()); $definitions = $container->getDefinitions(); - $this->assertSame('service_container', key($definitions)); - - array_shift($definitions); $this->assertStringStartsWith('1_', key($definitions)); $anonymous = current($definitions);