10000 [HttpKernel] Move services reset to Kernel · symfony/symfony@fddc8fe · GitHub
[go: up one dir, main page]

Skip to content

Commit fddc8fe

Browse files
[HttpKernel] Move services reset to Kernel
1 parent fdac9e3 commit fddc8fe

File tree

9 files changed

+140
-162
lines changed

9 files changed

+140
-162
lines changed

src/Symfony/Bundle/FrameworkBundle/Resources/config/services.xml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,6 @@
7575
<tag name="config_cache.resource_checker" priority="-990" />
7676
</service>
7777

78-
<service id="Symfony\Component\HttpKernel\EventListener\ServiceResetListener">
79-
<argument /> <!-- ResettableServicePass will inject an iterator of initialized services here ($serviceId => $serviceInstance) -->
80-
<argument type="collection" /> <!-- ResettableServicePass will inject an array of reset methods here ($serviceId => $method) -->
81-
<tag name="kernel.event_subscriber" />
82-
</service>
78+
<service id="services_resetter" class="Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter" public="true" />
8379
</services>
8480
</container>

src/Symfony/Component/HttpKernel/DependencyInjection/ResettableServicePass.php

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,18 @@
1717
use Symfony\Component\DependencyInjection\ContainerInterface;
1818
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
1919
use Symfony\Component\DependencyInjection\Reference;
20-
use Symfony\Component\HttpKernel\EventListener\ServiceResetListener;
2120

2221
/**
2322
* @author Alexander M. Turek <me@derrabus.de>
2423
*/
2524
class ResettableServicePass implements CompilerPassInterface
2625
{
26+
private $serviceName;
2727
private $tagName;
2828

29-
/**
30-
* @param string $tagName
31-
*/
32-
public function __construct($tagName = 'kernel.reset')
29+
public function __construct($serviceName = 'services_resetter', $tagName = 'kernel.reset')
3330
{
31+
$this->serviceName = $serviceName;
3432
$this->tagName = $tagName;
3533
}
3634

@@ -39,7 +37,7 @@ public function __construct($tagName = 'kernel.reset')
3937
*/
4038
public function process(ContainerBuilder $container)
4139
{
42-
if (!$container->has(ServiceResetListener::class)) {
40+
if (!$container->has($this->serviceName)) {
4341
return;
4442
}
4543

@@ -57,13 +55,13 @@ public function process(ContainerBuilder $container)
5755
}
5856

5957
if (empty($services)) {
60-
$container->removeDefinition(ServiceResetListener::class);
58+
$container->removeDefinition($this->serviceName);
6159

6260
return;
6361
}
6462

65-
$container->findDefinition(ServiceResetListener::class)
66-
->replaceArgument(0, new IteratorArgument($services))
67-
->replaceArgument(1, $methods);
63+
$container->findDefinition($this->serviceName)
64+
->setArgument(0, new IteratorArgument($services))
65+
->setArgument(1, $methods);
6866
}
6967
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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\Component\HttpKernel\DependencyInjection;
13+
14+
/**
15+
* Resets provided services.
16+
*
17+
* @author Alexander M. Turek <me@derrabus.de>
18+
* @author Nicolas Grekas <p@tchwork.com>
19+
*/
20+
class ServicesResetter
21+
{
22+
private $resettableServices;
23+
private $resetMethods;
24+
25+
public function __construct(\Traversable $resettableServices, array $resetMethods)
26+
{
27+
$this->resettableServices = $resettableServices;
28+
$this->resetMethods = $resetMethods;
29+
}
30+
31+
public function resetServices()
32+
{
33+
foreach ($this->resettableServices as $id => $service) {
34+
$service->{$this->resetMethods[$id]}();
35+
}
36+
}
37+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Symfony\Component\HttpKernel\Tests\DependencyInjection;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter;
7+
use Symfony\Component\HttpKernel\Tests\Fixtures\ClearableService;
8+
use Symfony\Component\HttpKernel\Tests\Fixtures\ResettableService;
9+
10+
class ServicesResetterTest extends TestCase
11+
{
12+
protected function setUp()
13+
{
14+
ResettableService::$counter = 0;
15+
ClearableService::$counter = 0;
16+
}
17+
18+
public function testResetServices()
19+
{
20+
$resetter = new ServicesResetter(new \ArrayIterator(array(
21+
'id1' => new ResettableService(),
22+
'id2' => new ClearableService(),
23+
)), array(
24+
'id1' => 'reset',
25+
'id2' => 'clear',
26+
));
27+
28+
$resetter->resetServices();
29+
30+
$this->assertEquals(1, ResettableService::$counter);
31+
$this->assertEquals(1, ClearableService::$counter);
32+
}
33+
}

src/Symfony/Component/HttpKernel/EventListener/ServiceResetListener.php

Lines changed: 0 additions & 50 deletions
This file was deleted.

src/Symfony/Component/HttpKernel/Kernel.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl
6464

6565
private $projectDir;
6666
private $warmupDir;
67+
private $requestStackSize;
6768

6869
const VERSION = '3.4.0-DEV';
6970
const VERSION_ID = 30400;
@@ -186,7 +187,15 @@ public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQ
186187
$this->boot();
187188
}
188189

189-
return $this->getHttpKernel()->handle($request, $type, $catch);
190+
try {
191+
if (0 === $this->requestStackSize++ && $this->container->has('services_resetter')) {
192+
$this->container->get('services_resetter')->resetServices();
193+
}
194+
195+
return $this->getHttpKernel()->handle($request, $type, $catch);
196+
} finally {
197+
--$this->requestStackSize;
198+
}
190199
}
191200

192201
/**

src/Symfony/Component/HttpKernel/Tests/DependencyInjection/ResettableServicePassTest.php

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use Symfony\Component\DependencyInjection\ContainerInterface;
99
use Symfony\Component\DependencyInjection\Reference;
1010
use Symfony\Component\HttpKernel\DependencyInjection\ResettableServicePass;
11-
use Symfony\Component\HttpKernel\EventListener\ServiceResetListener;
11+
use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter;
1212
use Symfony\Component\HttpKernel\Tests\Fixtures\ClearableService;
1313
use Symfony\Component\HttpKernel\Tests\Fixtures\ResettableService;
1414

@@ -24,14 +24,14 @@ public function testCompilerPass()
2424
->setPublic(true)
2525
->addTag('kernel.reset', array('method' => 'clear'));
2626

27-
$container->register(ServiceResetListener::class)
27+
$container->register('services_resetter', ServicesResetter::class)
2828
->setPublic(true)
2929
->setArguments(array(null, array()));
30-
$container->addCompilerPass(new ResettableServicePass('kernel.reset'));
30+
$container->addCompilerPass(new ResettableServicePass());
3131

3232
$container->compile();
3333

34-
$definition = $container->getDefinition(ServiceResetListener::class);
34+
$definition = $container->getDefinition('services_resetter');
3535

3636
$this->assertEquals(
3737
array(
@@ -57,32 +57,22 @@ public function testMissingMethod()
5757
$container = new ContainerBuilder();
5858
$container->register(ResettableService::class)
5959
->addTag('kernel.reset');
60-
$container->register(ServiceResetListener::class)
60+
$container->register('services_resetter', ServicesResetter::class)
6161
->setArguments(array(null, array()));
62-
$container->addCompilerPass(new ResettableServicePass('kernel.reset'));
62+
$container->addCompilerPass(new ResettableServicePass());
6363

6464
$container->compile();
6565
}
6666

6767
public function testCompilerPassWithoutResetters()
6868
{
6969
$container = new ContainerBuilder();
70-
$container->register(ServiceResetListener::class)
70+
$container->register('services_resetter', ServicesResetter::class)
7171
->setArguments(array(null, array()));
7272
$container->addCompilerPass(new ResettableServicePass());
7373

7474
$container->compile();
7575

76-
$this->assertFalse($container->has(ServiceResetListener::class));
77-
}
78-
79-
public function testCompilerPassWithoutListener()
80-
{
81-
$container = new ContainerBuilder();
82-
$container->addCompilerPass(new ResettableServicePass());
83-
84-
$container->compile();
85-
86-
$this->assertFalse($container->has(ServiceResetListener::class));
76+
$this->assertFalse($container->has('services_resetter'));
8777
}
8878
}

src/Symfony/Component/HttpKernel/Tests/EventListener/ServiceResetListenerTest.php

Lines changed: 0 additions & 77 deletions
This file was deleted.

0 commit comments

Comments
 (0)
0