Skip to content

Commit 1a9e402

Browse files
Make as many services private as possible
1 parent 83abe4b commit 1a9e402

16 files changed

+406
-13
lines changed

Alias.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Alias
1515
{
1616
private $id;
1717
private $public;
18+
private $private = false;
1819

1920
/**
2021
* @param string $id Alias identifier
@@ -40,10 +41,43 @@ public function isPublic()
4041
* Sets if this Alias is public.
4142
*
4243
* @param bool $boolean If this Alias should be public
44+
*
45+
* @return $this
4346
*/
4447
public function setPublic($boolean)
4548
{
4649
$this->public = (bool) $boolean;
50+
51+
return $this;
52+
}
53+
54+
/**
55+
* Sets if this Alias is private.
56+
*
57+
* When set, the "private" state has a higher precedence than "public".
58+
* In version 3.4, a "private" alias always remains publicly accessible,
59+
* but triggers a deprecation notice when accessed from the container,
60+
* so that the alias can be made really private in 4.0.
61+
*
62+
* @param bool $boolean
63+
*
64+
* @return $this
65+
*/
66+
public function setPrivate($boolean)
67+
{
68+
$this->private = (bool) $boolean;
69+
70+
return $this;
71+
}
72+
73+
/**
74+
* Whether this alias is private.
75+
*
76+
* @return bool
77+
*/
78+
public function isPrivate()
79+
{
80+
return $this->private;
4781
}
4882

4983
/**

Compiler/CheckDefinitionValidityPass.php

Lines changed: 1 addition & 1 deletion
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()) {
42+
if ($definition->isSynthetic() && (!$definition->isPublic() || $definition->isPrivate())) {
4343
throw new RuntimeException(sprintf('A synthetic service ("%s") must be public.', $id));
4444
}
4545

Compiler/DecoratorServicePass.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public function process(ContainerBuilder $container)
4949
if ($container->hasAlias($inner)) {
5050
$alias = $container->getAlias($inner);
5151
$public = $alias->isPublic();
52+
$private = $alias->isPrivate();
5253
$container->setAlias($renamedId, new Alias((string) $alias, false));
5354
} else {
5455
$decoratedDefinition = $container->getDefinition($inner);
@@ -57,6 +58,7 @@ public function process(ContainerBuilder $container)
5758
$definition->setAutowiringTypes($types);
5859
}
5960
$public = $decoratedDefinition->isPublic();
61+
$private = $decoratedDefinition->isPrivate();
6062
$decoratedDefinition->setPublic(false);
6163
$decoratedDefinition->setTags(array());
6264
if ($decoratedDefinition->getAutowiringTypes(false)) {
@@ -65,7 +67,7 @@ public function process(ContainerBuilder $container)
6567
$container->setDefinition($renamedId, $decoratedDefinition);
6668
}
6769

68-
$container->setAlias($inner, new Alias($id, $public));
70+
$container->setAlias($inner, $id)->setPublic($public && !$private)->setPrivate($private);
6971
}
7072
}
7173
}

Compiler/InlineServiceDefinitionsPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ private function isInlineableDefinition($id, Definition $definition, ServiceRefe
8282
return true;
8383
}
8484

85-
if ($definition->isDeprecated() || $definition->isPublic() || $definition->isLazy()) {
85+
if ($definition->isDeprecated() || $definition->isPublic() || $definition->isPrivate() || $definition->isLazy()) {
8686
return false;
8787
}
8888

Compiler/RemovePrivateAliasesPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class RemovePrivateAliasesPass implements CompilerPassInterface
3030
public function process(ContainerBuilder $container)
3131
{
3232
foreach ($container->getAliases() as $id => $alias) {
33-
if ($alias->isPublic()) {
33+
if ($alias->isPublic() || $alias->isPrivate()) {
3434
continue;
3535
}
3636

Compiler/RemoveUnusedDefinitionsPass.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public function process(ContainerBuilder $container)
4141

4242
$hasChanged = false;
4343
foreach ($container->getDefinitions() as $id => $definition) {
44-
if ($definition->isPublic()) {
44+
if ($definition->isPublic() || $definition->isPrivate()) {
4545
continue;
4646
}
4747

@@ -68,7 +68,8 @@ public function process(ContainerBuilder $container)
6868

6969
if (1 === count($referencingAliases) && false === $isReferenced) {
7070
$container->setDefinition((string) reset($referencingAliases), $definition);
71-
$definition->setPublic(true);
71+
$definition->setPrivate(reset($referencingAliases)->isPrivate());
72+
$definition->setPublic(!$definition->isPrivate());
7273
$container->removeDefinition($id);
7374
$container->log($this, sprintf('Removed service "%s"; reason: replaces alias %s.', $id, reset($referencingAliases)));
7475
} elseif (0 === count($referencingAliases) && false === $isReferenced) {

Compiler/ReplaceAliasByActualDefinitionPass.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,12 @@ public function process(ContainerBuilder $container)
5858
} catch (InvalidArgumentException $e) {
5959
throw new InvalidArgumentException(sprintf('Unable to replace alias "%s" with actual definition "%s".', $definitionId, $targetId), null, $e);
6060
}
61-
if ($definition->isPublic()) {
61+
if ($definition->isPublic() || $definition->isPrivate()) {
6262
continue;
6363
}
6464
// Remove private definition and schedule for replacement
65-
$definition->setPublic(true);
65+
$definition->setPublic(!$target->isPrivate());
66+
$definition->setPrivate($target->isPrivate());
6667
$container->setDefinition($definitionId, $definition);
6768
$container->removeDefinition($targetId);
6869
$replacements[$targetId] = $definitionId;

Compiler/ResolveChildDefinitionsPass.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\DependencyInjection\Compiler;
1313

1414
use Symfony\Component\DependencyInjection\ChildDefinition;
15+
use Symfony\Component\DependencyInjection\ContainerBuilder;
1516
use Symfony\Component\DependencyInjection\Definition;
1617
use Symfony\Component\DependencyInjection\Exception\ExceptionInterface;
1718
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
@@ -25,6 +26,26 @@
2526
*/
2627
class ResolveChildDefinitionsPass extends AbstractRecursivePass
2728
{
29+
/**
30+
* {@inheritdoc}
31+
*/
32+
public function process(ContainerBuilder $container)
33+
{
34+
parent::process($container);
35+
36+
foreach ($container->getDefinitions() as $definition) {
37+
if ($definition->isPrivate()) {
38+
$definition->setPublic(false);
39+
}
40+
}
41+
42+
foreach ($container->getAliases() as $alias) {
43+
if ($alias->isPrivate()) {
44+
$alias->setPublic(false);
45+
}
46+
}
47+
}
48+
2849
protected function processValue($value, $isRoot = false)
2950
{
3051
if (!$value instanceof Definition) {
@@ -121,6 +142,8 @@ private function doResolveDefinition(ChildDefinition $definition)
121142
}
122143
if (isset($changes['public'])) {
123144
$def->setPublic($definition->isPublic());
145+
} else {
146+
$def->setPrivate($definition->isPrivate() || $parentDef->isPrivate());
124147
}
125148
if (isset($changes['lazy'])) {
126149
$def->setLazy($definition->isLazy());

Compiler/ResolveReferencesToAliasesPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function process(ContainerBuilder $container)
5151
foreach ($container->getAliases() as $id => $alias) {
5252
$aliasId = (string) $alias;
5353
if ($aliasId !== $defId = $this->getDefinitionId($aliasId)) {
54-
$container->setAlias($id, new Alias($defId, $alias->isPublic()));
54+
$container->setAlias($id, $defId)->setPublic($alias->isPublic() && !$alias->isPrivate())->setPrivate($alias->isPrivate());
5555
}
5656
}
5757
}

ContainerBuilder.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,8 @@ public function setAliases(array $aliases)
806806
* @param string $alias The alias to create
807807
* @param string|Alias $id The service to alias
808808
*
809+
* @return Alias
810+
*
809811
* @throws InvalidArgumentException if the id is not a string or an Alias
810812
* @throws InvalidArgumentException if the alias is for itself
811813
*/
@@ -825,7 +827,7 @@ public function setAlias($alias, $id)
825827

826828
unset($this->definitions[$alias]);
827829

828-
$this->aliasDefinitions[$alias] = $id;
830+
return $this->aliasDefinitions[$alias] = $id;
829831
}
830832

831833
/**

0 commit comments

Comments
 (0)