Skip to content

Commit ffa79ba

Browse files
bug #27528 [FrameworkBundle] give access to non-shared services when using test.service_container (nicolas-grekas)
This PR was merged into the 4.1 branch. Discussion ---------- [FrameworkBundle] give access to non-shared services when using test.service_container | Q | A | ------------- | --- | Branch? | 4.1 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #27488 | License | MIT | Doc PR | - Commits ------- 516ff5a [FrameworkBundle] give access to non-shared services when using test.service_container
2 parents fb4c79b + 516ff5a commit ffa79ba

File tree

3 files changed

+65
-1
lines changed

3 files changed

+65
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Compiler;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TestServiceContainerWeakRefPass;
16+
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TestServiceContainerRealRefPass;
17+
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
18+
use Symfony\Component\DependencyInjection\ContainerBuilder;
19+
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
20+
use Symfony\Component\DependencyInjection\ServiceLocator;
21+
use Symfony\Component\DependencyInjection\Reference;
22+
23+
class TestServiceContainerRefPassesTest extends TestCase
24+
{
25+
public function testProcess()
26+
{
27+
$container = new ContainerBuilder();
28+
$container->register('test.private_services_locator', ServiceLocator::class)
29+
->setPublic(true)
30+
->addArgument(0, array());
31+
32+
$container->addCompilerPass(new TestServiceContainerWeakRefPass(), PassConfig::TYPE_BEFORE_REMOVING, -32);
33+
$container->addCompilerPass(new TestServiceContainerRealRefPass(), PassConfig::TYPE_AFTER_REMOVING);
34+
35+
$container->register('Test\public_service')
36+
->setPublic(true)
37+
->addArgument(new Reference('Test\private_used_shared_service'))
38+
->addArgument(new Reference('Test\private_used_non_shared_service'))
39+
;
40+
41+
$container->register('Test\private_used_shared_service');
42+
$container->register('Test\private_unused_shared_service');
43+
$container->register('Test\private_used_non_shared_service')->setShared(false);
44+
$container->register('Test\private_unused_non_shared_service')->setShared(false);
45+
46+
$container->compile();
47+
48+
$expected = array(
49+
'Test\private_used_shared_service' => new ServiceClosureArgument(new Reference('Test\private_used_shared_service')),
50+
'Test\private_used_non_shared_service' => new ServiceClosureArgument(new Reference('Test\private_used_non_shared_service')),
51+
'Psr\Container\ContainerInterface' => new ServiceClosureArgument(new Reference('service_container')),
52+
'Symfony\Component\DependencyInjection\ContainerInterface' => new ServiceClosureArgument(new Reference('service_container')),
53+
);
54+
$this->assertEquals($expected, $container->getDefinition('test.private_services_locator')->getArgument(0));
55+
$this->assertSame($container, $container->get('test.private_services_locator')->get('Psr\Container\ContainerInterface'));
56+
$this->assertFalse($container->getDefinition('Test\private_used_non_shared_service')->isShared());
57+
}
58+
}

src/Symfony/Bundle/FrameworkBundle/composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"php": "^7.1.3",
2020
"ext-xml": "*",
2121
"symfony/cache": "~3.4|~4.0",
22-
"symfony/dependency-injection": "^4.1",
22+
"symfony/dependency-injection": "^4.1.1",
2323
"symfony/config": "~3.4|~4.0",
2424
"symfony/event-dispatcher": "^4.1",
2525
"symfony/http-foundation": "^4.1",

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

+6
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ private function isInlineableDefinition($id, Definition $definition, ServiceRefe
9393
}
9494

9595
if (!$definition->isShared()) {
96+
foreach ($graph->getNode($id)->getInEdges() as $edge) {
97+
if ($edge->isWeak()) {
98+
return false;
99+
}
100+
}
101+
96102
return true;
97103
}
98104

0 commit comments

Comments
 (0)