Skip to content

Commit ad4bc6b

Browse files
feature #24238 [DI] Turn services and aliases private by default, with BC layer (nicolas-grekas)
This PR was merged into the 3.4 branch. Discussion ---------- [DI] Turn services and aliases private by default, with BC layer | Q | A | ------------- | --- | Branch? | 3.4 | Bug fix? | no | New feature? | no | BC breaks? | no | Deprecations? | yes | Tests pass? | yes | Fixed tickets | #20048 | License | MIT | Doc PR | - With this PR, all services and aliases are made private by default. This is done in a BC way, thanks to the layer introduced in #24104. We will require bundles to explicitly opt-in for "public", either using "defaults", or stating `public="true"` explicitly. Same in DI extension, where calling `->setPublic(true)` will be required in 4.0. Commits ------- 9948b09 [DI] Turn services and aliases private by default, with BC layer
2 parents 55a7691 + 9948b09 commit ad4bc6b

File tree

78 files changed

+264
-121
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

78 files changed

+264
-121
lines changed

UPGRADE-3.4.md

+7-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ UPGRADE FROM 3.3 to 3.4
44
DependencyInjection
55
-------------------
66

7+
* Definitions and aliases will be made private by default in 4.0. You should either use service injection
8+
or explicitly define your services as public if you really need to inject the container.
9+
710
* Relying on service auto-registration while autowiring is deprecated and won't be supported
811
in Symfony 4.0. Explicitly inject your dependencies or create services
912
whose ids are their fully-qualified class name.
@@ -154,7 +157,7 @@ FrameworkBundle
154157
* The `Symfony\Bundle\FrameworkBundle\Translation\TranslationLoader`
155158
class has been deprecated and will be removed in 4.0. Use the
156159
`Symfony\Component\Translation\Reader\TranslationReader` class instead.
157-
160+
158161
* The `translation.loader` service has been deprecated and will be removed in 4.0.
159162
Use the `translation.reader` service instead..
160163

@@ -269,9 +272,9 @@ SecurityBundle
269272
Translation
270273
-----------
271274

272-
* `Symfony\Component\Translation\Writer\TranslationWriter::writeTranslations` has been deprecated
273-
and will be removed in 4.0, use `Symfony\Component\Translation\Writer\TranslationWriter::write`
274-
instead.
275+
* `Symfony\Component\Translation\Writer\TranslationWriter::writeTranslations` has been deprecated
276+
and will be removed in 4.0, use `Symfony\Component\Translation\Writer\TranslationWriter::write`
277+
instead.
275278

276279
* Passing a `Symfony\Component\Translation\MessageSelector` to `Translator` has been
277280
deprecated. You should pass a message formatter instead

UPGRADE-4.0.md

+9-6
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ Debug
7777
DependencyInjection
7878
-------------------
7979

80+
* Definitions and aliases are now private by default in 4.0. You should either use service injection
81+
or explicitly define your services as public if you really need to inject the container.
82+
8083
* Relying on service auto-registration while autowiring is not supported anymore.
8184
Explicitly inject your dependencies or create services whose ids are
8285
their fully-qualified class name.
@@ -449,14 +452,14 @@ FrameworkBundle
449452
* The `Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslatorPass`
450453
class has been removed. Use the
451454
`Symfony\Component\Translation\DependencyInjection\TranslatorPass` class instead.
452-
455+
453456
* The `Symfony\Bundle\FrameworkBundle\Translation\TranslationLoader`
454457
class has been deprecated and will be removed in 4.0. Use the
455458
`Symfony\Component\Translation\Reader\TranslationReader` class instead.
456459

457460
* The `translation.loader` service has been removed.
458461
Use the `translation.reader` service instead.
459-
462+
460463
* `AssetsInstallCommand::__construct()` now requires an instance of
461464
`Symfony\Component\Filesystem\Filesystem` as first argument.
462465

@@ -673,11 +676,11 @@ Translation
673676
-----------
674677

675678
* Removed the backup feature from the file dumper classes.
676-
679+
677680
* The default value of the `$readerServiceId` argument of `TranslatorPass::__construct()` has been changed to `"translation.reader"`.
678-
679-
* Removed `Symfony\Component\Translation\Writer\TranslationWriter::writeTranslations`,
680-
use `Symfony\Component\Translation\Writer\TranslationWriter::write` instead.
681+
682+
* Removed `Symfony\Component\Translation\Writer\TranslationWriter::writeTranslations`,
683+
use `Symfony\Component\Translation\Writer\TranslationWriter::write` instead.
681684

682685
* Removed support for passing `Symfony\Component\Translation\MessageSelector` as a second argument to the
683686
`Translator::__construct()`. You should pass an instance of `Symfony\Component\Translation\Formatter\MessageFormatterInterface` instead.

src/Symfony/Bridge/ProxyManager/Tests/LazyProxy/Dumper/PhpDumperTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ private function dumpLazyServiceProjectServiceContainer()
6161
{
6262
$container = new ContainerBuilder();
6363

64-
$container->register('foo', 'stdClass');
64+
$container->register('foo', 'stdClass')->setPublic(true);
6565
$container->getDefinition('foo')->setLazy(true);
6666
$container->compile();
6767

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -1012,12 +1012,12 @@ private function registerTemplatingConfiguration(array $config, ContainerBuilder
10121012

10131013
// Use a delegation unless only a single engine was registered
10141014
if (1 === count($engines)) {
1015-
$container->setAlias('templating', (string) reset($engines));
1015+
$container->setAlias('templating', (string) reset($engines))->setPublic(true);
10161016
} else {
10171017
foreach ($engines as $engine) {
10181018
$container->getDefinition('templating.engine.delegating')->addMethodCall('addEngine', array($engine));
10191019
}
1020-
$container->setAlias('templating', 'templating.engine.delegating');
1020+
$container->setAlias('templating', 'templating.engine.delegating')->setPublic(true);
10211021
}
10221022

10231023
$container->getDefinition('fragment.renderer.hinclude')
@@ -1213,7 +1213,7 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder
12131213
$container->getDefinition('translation.writer')->setPrivate(true);
12141214

12151215
// Use the "real" translator instead of the identity default
1216-
$container->setAlias('translator', 'translator.default');
1216+
$container->setAlias('translator', 'translator.default')->setPublic(true);
12171217
$container->setAlias('translator.formatter', new Alias($config['formatter'], false));
12181218
$translator = $container->findDefinition('translator.default');
12191219
$translator->addMethodCall('setFallbackLocales', array($config['fallbacks']));

src/Symfony/Bundle/FrameworkBundle/Kernel/MicroKernelTrait.php

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public function registerContainerConfiguration(LoaderInterface $loader)
7272
if ($this instanceof EventSubscriberInterface) {
7373
$container->register('kernel', static::class)
7474
->setSynthetic(true)
75+
->setPublic(true)
7576
->addTag('kernel.event_subscriber')
7677
;
7778
}

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/AutowiringTypes/config.yml

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ imports:
22
- { resource: ../config/default.yml }
33

44
services:
5+
_defaults: { public: true }
56
test.autowiring_types.autowired_services:
67
class: Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\AutowiringTypes\AutowiredServices
78
autowire: true

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/ContainerDebug/config.yml

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ imports:
22
- { resource: ../config/default.yml }
33

44
services:
5+
_defaults: { public: true }
56
public:
67
class: Symfony\Bundle\FrameworkBundle\Tests\Fixtures\DeclaredClass
78
private_alias:

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/Serializer/config.yml

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ imports:
22
- { resource: ../config/default.yml }
33

44
services:
5+
_defaults: { public: true }
56
test.property_info: '@property_info'
67

78
framework:

src/Symfony/Bundle/FrameworkBundle/Tests/Kernel/ConcreteMicroKernel.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ protected function configureContainer(ContainerBuilder $c, LoaderInterface $load
8282
));
8383

8484
$c->setParameter('halloween', 'Have a great day!');
85-
$c->register('halloween', 'stdClass');
85+
$c->register('halloween', 'stdClass')->setPublic(true);
8686
}
8787

8888
/**

src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ private function configureDbalAclProvider(array $config, ContainerBuilder $conta
185185
$container->getAlias('security.acl.provider')->setPrivate(true);
186186

187187
if (null !== $config['connection']) {
188-
$container->setAlias('security.acl.dbal.connection', sprintf('doctrine.dbal.%s_connection', $config['connection']));
188+
$container->setAlias('security.acl.dbal.connection', sprintf('doctrine.dbal.%s_connection', $config['connection']))->setPrivate(true);
189189
}
190190

191191
$container

src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/Acl/config.yml

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ imports:
22
- { resource: ./../config/framework.yml }
33

44
services:
5+
_defaults: { public: true }
56
test.security.acl.provider: '@security.acl.provider'
67

78
doctrine:

src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/AutowiringTypes/config.yml

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ imports:
22
- { resource: ../config/framework.yml }
33

44
services:
5+
_defaults: { public: true }
56
test.autowiring_types.autowired_services:
67
class: Symfony\Bundle\SecurityBundle\Tests\Functional\Bundle\AutowiringBundle\AutowiredServices
78
autowire: true

src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ public function process(ContainerBuilder $container)
6565
if (isset($serviceIds[$commandId]) || $container->hasAlias($commandId)) {
6666
$commandId = $commandId.'_'.$id;
6767
}
68-
if (!$definition->isPublic()) {
69-
$container->setAlias($commandId, $id);
68+
if (!$definition->isPublic() || $definition->isPrivate()) {
69+
$container->setAlias($commandId, $id)->setPublic(true);
7070
$id = $commandId;
7171
}
7272
$serviceIds[$commandId] = $id;
@@ -97,6 +97,7 @@ public function process(ContainerBuilder $container)
9797

9898
$container
9999
->register($this->commandLoaderServiceId, ContainerCommandLoader::class)
100+
->setPublic(true)
100101
->setArguments(array(ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap));
101102

102103
$container->setParameter('console.command.ids', $serviceIds);

src/Symfony/Component/Console/composer.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"require-dev": {
2424
"symfony/config": "~3.3|~4.0",
2525
"symfony/event-dispatcher": "~2.8|~3.0|~4.0",
26-
"symfony/dependency-injection": "~3.3|~4.0",
26+
"symfony/dependency-injection": "~3.4|~4.0",
2727
"symfony/lock": "~3.4|~4.0",
2828
"symfony/process": "~3.3|~4.0",
2929
"psr/log": "~1.0"
@@ -35,7 +35,7 @@
3535
"psr/log": "For using the console logger"
3636
},
3737
"conflict": {
38-
"symfony/dependency-injection": "<3.3",
38+
"symfony/dependency-injection": "<3.4",
3939
"symfony/process": "<3.3"
4040
},
4141
"autoload": {

src/Symfony/Component/DependencyInjection/Alias.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class Alias
1515
{
1616
private $id;
1717
private $public;
18-
private $private = false;
18+
private $private;
1919

2020
/**
2121
* @param string $id Alias identifier
@@ -25,6 +25,7 @@ public function __construct($id, $public = true)
2525
{
2626
$this->id = (string) $id;
2727
$this->public = $public;
28+
$this->private = 2 > func_num_args();
2829
}
2930

3031
/**
@@ -47,6 +48,7 @@ public function isPublic()
4748
public function setPublic($boolean)
4849
{
4950
$this->public = (bool) $boolean;
51+
$this->private = false;
5052

5153
return $this;
5254
}

src/Symfony/Component/DependencyInjection/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
3.4.0
55
-----
66

7+
* deprecated "public-by-default" definitions and aliases, the new default will be "private" in 4.0
78
* added `EnvVarProcessorInterface` and corresponding "container.env_var_processor" tag for processing env vars
89
* added support for ignore-on-uninitialized references
910
* deprecated service auto-registration while autowiring

src/Symfony/Component/DependencyInjection/Compiler/AutoAliasServicePass.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public function process(ContainerBuilder $container)
3333

3434
$aliasId = $container->getParameterBag()->resolveValue($tag['format']);
3535
if ($container->hasDefinition($aliasId) || $container->hasAlias($aliasId)) {
36-
$container->setAlias($serviceId, new Alias($aliasId));
36+
$container->setAlias($serviceId, new Alias($aliasId, true));
3737
}
3838
}
3939
}

src/Symfony/Component/DependencyInjection/Compiler/CheckDefinitionValidityPass.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function process(ContainerBuilder $container)
3939
{
4040
foreach ($container->getDefinitions() as $id => $definition) {
4141
// synthetic service is public
42-
if ($definition->isSynthetic() && (!$definition->isPublic() || $definition->isPrivate())) {
42+
if ($definition->isSynthetic() && !($definition->isPublic() || $definition->isPrivate())) {
4343
throw new RuntimeException(sprintf('A synthetic service ("%s") must be public.', $id));
4444
}
4545

src/Symfony/Component/DependencyInjection/Compiler/DecoratorServicePass.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public function process(ContainerBuilder $container)
6767
$container->setDefinition($renamedId, $decoratedDefinition);
6868
}
6969

70-
$container->setAlias($inner, $id)->setPublic($public && !$private)->setPrivate($private);
70+
$container->setAlias($inner, $id)->setPublic($public)->setPrivate($private);
7171
}
7272
}
7373
}

src/Symfony/Component/DependencyInjection/Compiler/RegisterEnvVarProcessorsPass.php

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public function process(ContainerBuilder $container)
5252
$bag->setProvidedTypes($types);
5353
}
5454
$container->register('container.env_var_processors_locator', ServiceLocator::class)
55+
->setPublic(true)
5556
->setArguments(array($processors))
5657
;
5758
}

src/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public function process(ContainerBuilder $container)
4545
}
4646
// Check if target needs to be replaces
4747
if (isset($replacements[$targetId])) {
48-
$container->setAlias($definitionId, $replacements[$targetId]);
48+
$container->setAlias($definitionId, $replacements[$targetId])->setPublic($target->isPublic())->setPrivate($target->isPrivate());
4949
}
5050
// No need to process the same target twice
5151
if (isset($seenAliasTargets[$targetId])) {

src/Symfony/Component/DependencyInjection/Compiler/ResolveChildDefinitionsPass.php

+2
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ public function process(ContainerBuilder $container)
3636
foreach ($container->getDefinitions() as $definition) {
3737
if ($definition->isPrivate()) {
3838
$definition->setPublic(false);
39+
$definition->setPrivate(true);
3940
}
4041
}
4142

4243
foreach ($container->getAliases() as $alias) {
4344
if ($alias->isPrivate()) {
4445
$alias->setPublic(false);
46+
$alias->setPrivate(true);
4547
}
4648
}
4749
}

src/Symfony/Component/DependencyInjection/Compiler/ResolveReferencesToAliasesPass.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function process(ContainerBuilder $container)
3232
foreach ($container->getAliases() as $id => $alias) {
3333
$aliasId = (string) $alias;
3434
if ($aliasId !== $defId = $this->getDefinitionId($aliasId, $container)) {
35-
$container->setAlias($id, $defId)->setPublic($alias->isPublic() && !$alias->isPrivate())->setPrivate($alias->isPrivate());
35+
$container->setAlias($id, $defId)->setPublic($alias->isPublic())->setPrivate($alias->isPrivate());
3636
}
3737
}
3838
}

src/Symfony/Component/DependencyInjection/Definition.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Definition
3535
private $configurator;
3636
private $tags = array();
3737
private $public = true;
38-
private $private = false;
38+
private $private = true;
3939
private $synthetic = false;
4040
private $abstract = false;
4141
private $lazy = false;
@@ -603,6 +603,7 @@ public function setPublic($boolean)
603603
$this->changes['public'] = true;
604604

605605
$this->public = (bool) $boolean;
606+
$this->private = false;
606607

607608
return $this;
608609
}

src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ private function addService($definition, $id, \DOMElement $parent)
122122
if (!$definition->isShared()) {
123123
$service->setAttribute('shared', 'false');
124124
}
125-
if (!$definition->isPublic()) {
126-
$service->setAttribute('public', 'false');
125+
if (!$definition->isPrivate()) {
126+
$service->setAttribute('public', $definition->isPublic() ? 'true' : 'false');
127127
}
128128
if ($definition->isSynthetic()) {
129129
$service->setAttribute('synthetic', 'true');
@@ -242,8 +242,8 @@ private function addServiceAlias($alias, Alias $id, \DOMElement $parent)
242242
$service = $this->document->createElement('service');
243243
$service->setAttribute('id', $alias);
244244
$service->setAttribute('alias', $id);
245-
if (!$id->isPublic()) {
246-
$service->setAttribute('public', 'false');
245+
if (!$id->isPrivate()) {
246+
$service->setAttribute('public', $id->isPublic() ? 'true' : 'false');
247247
}
248248
$parent->appendChild($service);
249249
}

src/Symfony/Component/DependencyInjection/Dumper/YamlDumper.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ private function addService($id, $definition)
7474
$code .= sprintf(" class: %s\n", $this->dumper->dump($class));
7575
}
7676

77-
if (!$definition->isPublic()) {
78-
$code .= " public: false\n";
77+
if (!$definition->isPrivate()) {
78+
$code .= sprintf(" public: %s\n", $definition->isPublic() ? 'true' : 'false');
7979
}
8080

8181
$tagsCode = '';
@@ -178,11 +178,11 @@ private function addService($id, $definition)
178178
*/
179179
private function addServiceAlias($alias, $id)
180180
{
181-
if ($id->isPublic()) {
181+
if ($id->isPrivate()) {
182182
return sprintf(" %s: '@%s'\n", $alias, $id);
183183
}
184184

185-
return sprintf(" %s:\n alias: %s\n public: false\n", $alias, $id);
185+
return sprintf(" %s:\n alias: %s\n public: %s\n", $alias, $id, $id->isPublic() ? 'true' : 'false');
186186
}
187187

188188
/**

src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php

+3-4
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,12 @@ private function parseDefinition(\DOMElement $service, $file, array $defaults)
203203
if ($alias = $service->getAttribute('alias')) {
204204
$this->validateAlias($service, $file);
205205

206-
$public = true;
206+
$this->container->setAlias((string) $service->getAttribute('id'), $alias = new Alias($alias));
207207
if ($publicAttr = $service->getAttribute('public')) {
208-
$public = XmlUtils::phpize($publicAttr);
208+
$alias->setPublic(XmlUtils::phpize($publicAttr));
209209
} elseif (isset($defaults['public'])) {
210-
$public = $defaults['public'];
210+
$alias->setPublic($defaults['public']);
211211
}
212-
$this->container->setAlias((string) $service->getAttribute('id'), new Alias($alias, $public));
213212

214213
return;
215214
}

0 commit comments

Comments
 (0)