Skip to content

Commit

Permalink
bug #24468 [DI] Turn private defs to non-public ones before removing …
Browse files Browse the repository at this point in the history
…passes (nicolas-grekas)

This PR was merged into the 3.4 branch.

Discussion
----------

[DI] Turn private defs to non-public ones before removing passes

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #24465
| License       | MIT
| Doc PR        | -

As spotted by @stof in #24465 (comment).

Commits
-------

e5d0934 [DI] Turn private defs to non-public ones before removing passes
  • Loading branch information
fabpot committed Oct 10, 2017
2 parents f756fb8 + e5d0934 commit 7f899a9
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 43 deletions.
Expand Up @@ -71,6 +71,12 @@ public function __construct()
new CheckArgumentsValidityPass(false),
));

$this->beforeRemovingPasses = array(
-100 => array(
new ResolvePrivatesPass(),
),
);

$this->removingPasses = array(array(
new RemovePrivateAliasesPass(),
new ReplaceAliasByActualDefinitionPass(),
Expand Down
Expand Up @@ -12,7 +12,6 @@
namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Exception\ExceptionInterface;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
Expand All @@ -26,28 +25,6 @@
*/
class ResolveChildDefinitionsPass extends AbstractRecursivePass
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
parent::process($container);

foreach ($container->getDefinitions() as $definition) {
if ($definition->isPrivate()) {
$definition->setPublic(false);
$definition->setPrivate(true);
}
}

foreach ($container->getAliases() as $alias) {
if ($alias->isPrivate()) {
$alias->setPublic(false);
$alias->setPrivate(true);
}
}
}

protected function processValue($value, $isRoot = false)
{
if (!$value instanceof Definition) {
Expand Down
@@ -0,0 +1,40 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;

/**
* @author Nicolas Grekas <p@tchwork.com>
*/
class ResolvePrivatesPass implements CompilerPassInterface
{
/**
* {@inheritdoc}
*/
public function process(ContainerBuilder $container)
{
foreach ($container->getDefinitions() as $id => $definition) {
if ($definition->isPrivate()) {
$definition->setPublic(false);
$definition->setPrivate(true);
}
}

foreach ($container->getAliases() as $id => $alias) {
if ($alias->isPrivate()) {
$alias->setPublic(false);
$alias->setPrivate(true);
}
}
}
}
Expand Up @@ -397,26 +397,6 @@ public function testSetAutoconfiguredOnServiceIsParent()
$this->assertFalse($container->getDefinition('child1')->isAutoconfigured());
}

public function testPrivateHasHigherPrecedenceThanPublic()
{
$container = new ContainerBuilder();

$container->register('foo', 'stdClass')
->setPublic(true)
->setPrivate(true)
;

$container->setAlias('bar', 'foo')
->setPublic(false)
->setPrivate(false)
;

$this->process($container);

$this->assertFalse($container->getDefinition('foo')->isPublic());
$this->assertFalse($container->getAlias('bar')->isPublic());
}

/**
* @group legacy
*/
Expand Down
@@ -0,0 +1,39 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\DependencyInjection\Tests\Compiler;

use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\Compiler\ResolvePrivatesPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;

class ResolvePrivatesPassTest extends TestCase
{
public function testPrivateHasHigherPrecedenceThanPublic()
{
$container = new ContainerBuilder();

$container->register('foo', 'stdClass')
->setPublic(true)
->setPrivate(true)
;

$container->setAlias('bar', 'foo')
->setPublic(false)
->setPrivate(false)
;

(new ResolvePrivatesPass())->process($container);

$this->assertFalse($container->getDefinition('foo')->isPublic());
$this->assertFalse($container->getAlias('bar')->isPublic());
}
}

0 comments on commit 7f899a9

Please sign in to comment.