Skip to content

Commit

Permalink
[DI] Turn private defs to non-public ones before removing passes
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolas-grekas committed Oct 7, 2017
1 parent 02deb82 commit a043965
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 43 deletions.
6 changes: 6 additions & 0 deletions Compiler/PassConfig.php
Original file line number Diff line number Diff line change
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
23 changes: 0 additions & 23 deletions Compiler/ResolveChildDefinitionsPass.php
Original file line number Diff line number Diff line change
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
40 changes: 40 additions & 0 deletions Compiler/ResolvePrivatesPass.php
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
}
20 changes: 0 additions & 20 deletions Tests/Compiler/ResolveChildDefinitionsPassTest.php
Original file line number Diff line number Diff line change
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
39 changes: 39 additions & 0 deletions Tests/Compiler/ResolvePrivatesPassTest.php
Original file line number Diff line number Diff line change
@@ -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 a043965

Please sign in to comment.