Skip to content

Commit 972297a

Browse files
[HttpFoundation][HttpKernel] Move ServiceResetListener logic to RequestStack
1 parent ed8c731 commit 972297a

File tree

8 files changed

+115
-172
lines changed

8 files changed

+115
-172
lines changed

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,5 @@
7474
<service id="Symfony\Component\Config\Resource\SelfCheckingResourceChecker">
7575
<tag name="config_cache.resource_checker" priority="-990" />
7676
</service>
77-
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>
8377
</services>
8478
</container>

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

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
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;
20+
use Symfony\Component\HttpKernel\ResettingRequestStack;
2121

2222
/**
2323
* @author Alexander M. Turek <me@derrabus.de>
@@ -39,7 +39,7 @@ public function __construct($tagName = 'kernel.reset')
3939
*/
4040
public function process(ContainerBuilder $container)
4141
{
42-
if (!$container->has(ServiceResetListener::class)) {
42+
if (!$container->has('request_stack')) {
4343
return;
4444
}
4545

@@ -56,14 +56,9 @@ public function process(ContainerBuilder $container)
5656
$methods[$id] = $attributes['method'];
5757
}
5858

59-
if (empty($services)) {
60-
$container->removeDefinition(ServiceResetListener::class);
61-
62-
return;
59+
if (!empty($services)) {
60+
$container->register('request_stack', ResettingRequestStack::class)
61+
->setArguments(array(new IteratorArgument($services), $methods));
6362
}
64-
65-
$container->findDefinition(ServiceResetListener::class)
66-
->replaceArgument(0, new IteratorArgument($services))
67-
->replaceArgument(1, $methods);
6863
}
6964
}

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

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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;
13+
14+
use Symfony\Component\HttpFoundation\Request;
15+
use Symfony\Component\HttpFoundation\RequestStack;
16+
17+
/**
18+
* Resets services on second master requests.
19+
*
20+
* @author Nicolas Grekas <p@tchwork.com>
21+
*/
22+
class ResettingRequestStack extends RequestStack
23+
{
24+
private $resetNeeded = false;
25+
private $resettableServices;
26+
private $resetMethods;
27+
28+
public function __construct(\Traversable $resettableServices, array $resetMethods)
29+
{
30+
$this->resettableServices = $resettableServices;
31+
$this->resetMethods = $resetMethods;
32+
}
33+
34+
/**
35+
* {@inheritdoc}
36+
*/
37+
public function push(Request $request)
38+
{
39+
if ($this->resetNeeded && !$this->getCurrentRequest()) {
40+
foreach ($this->resettableServices as $id => $service) {
41+
$service->{$this->resetMethods[$id]}();
42+
}
43+
} else {
44+
$this->resetNeeded = true;
45+
}
46+
47+
parent::push($request);
48+
}
49+
}

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

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
use Symfony\Component\DependencyInjection\ContainerBuilder;
88
use Symfony\Component\DependencyInjection\ContainerInterface;
99
use Symfony\Component\DependencyInjection\Reference;
10+
use Symfony\Component\HttpFoundation\RequestStack;
1011
use Symfony\Component\HttpKernel\DependencyInjection\ResettableServicePass;
11-
use Symfony\Component\HttpKernel\EventListener\ServiceResetListener;
1212
use Symfony\Component\HttpKernel\Tests\Fixtures\ClearableService;
1313
use Symfony\Component\HttpKernel\Tests\Fixtures\ResettableService;
1414

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

27-
$container->register(ServiceResetListener::class)
28-
->setPublic(true)
29-
->setArguments(array(null, array()));
27+
$container->register('request_stack', RequestStack::class)
28+
->setPublic(true);
3029
$container->addCompilerPass(new ResettableServicePass('kernel.reset'));
3130

3231
$container->compile();
3332

34-
$definition = $container->getDefinition(ServiceResetListener::class);
33+
$definition = $container->getDefinition('request_stack');
3534

3635
$this->assertEquals(
3736
array(
@@ -57,32 +56,10 @@ public function testMissingMethod()
5756
$container = new ContainerBuilder();
5857
$container->register(ResettableService::class)
5958
->addTag('kernel.reset');
60-
$container->register(ServiceResetListener::class)
59+
$container->register('request_stack', RequestStack::class)
6160
->setArguments(array(null, array()));
6261
$container->addCompilerPass(new ResettableServicePass('kernel.reset'));
6362

6463
$container->compile();
6564
}
66-
67-
public function testCompilerPassWithoutResetters()
68-
{
69-
$container = new ContainerBuilder();
70-
$container->register(ServiceResetListener::class)
71-
->setArguments(array(null, array()));
72-
$container->addCompilerPass(new ResettableServicePass());
73-
74-
$container->compile();
75-
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));
87-
}
8865
}

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

Lines changed: 0 additions & 77 deletions
This file was deleted.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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\HttpFoundation\Tests;
13+
14+
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\HttpFoundation\Request;
16+
use Symfony\Component\HttpKernel\ResettingRequestStack;
17+
use Symfony\Component\HttpKernel\Tests\Fixtures\ResettableService;
18+
19+
class ResettingRequestStackTest extends TestCase
20+
{
21+
protected function setUp()
22+
{
23+
ResettableService::$counter = 0;
24+
}
25+
26+
public function testResetServicesNoOp()
27+
{
28+
$requestStack = new ResettingRequestStack(new \ArrayIterator(array(new ResettableService())), array('reset'));
29+
30+
$masterRequest = Request::create('/foo');
31+
32+
$requestStack->push($masterRequest);
33+
34+
$this->assertEquals(0, ResettableService::$counter);
35+
}
36+
37+
public function testResetServices()
38+
{
39+
$requestStack = new ResettingRequestStack(new \ArrayIterator(array(new ResettableService())), array('reset'));
40+
41+
$masterRequest = Request::create('/foo');
42+
43+
$requestStack->push($masterRequest);
44+
$this->assertEquals(0, ResettableService::$counter);
45+
46+
$requestStack->pop();
47+
$this->assertEquals(0, ResettableService::$counter);
48+
49+
$requestStack->push($masterRequest);
50+
$this->assertEquals(1, ResettableService::$counter);
51+
52+
$requestStack->push($masterRequest);
53+
$this->assertEquals(1, ResettableService::$counter);
54+
}
55+
}

src/Symfony/Component/HttpKernel/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"require": {
1919
"php": "^5.5.9|>=7.0.8",
2020
"symfony/event-dispatcher": "~2.8|~3.0|~4.0",
21-
"symfony/http-foundation": "^3.3.11|~4.0",
21+
"symfony/http-foundation": "^3.4|~4.0",
2222
"symfony/debug": "~2.8|~3.0|~4.0",
2323
"psr/log": "~1.0"
2424
},

0 commit comments

Comments
 (0)