Skip to content

Commit e1b5839

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

File tree

9 files changed

+79
-170
lines changed

9 files changed

+79
-170
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/HttpFoundation/RequestStack.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ class RequestStack
2323
*/
2424
private $requests = array();
2525

26+
private $resetNeeded = false;
27+
private $resettableServices;
28+
private $resetMethods;
29+
30+
public function __construct(\Traversable $resettableServices = null, array $resetMethods = null)
31+
{
32+
$this->resettableServices = $resettableServices;
33+
$this->resetMethods = $resetMethods;
34+
}
35+
2636
/**
2737
* Pushes a Request on the stack.
2838
*
@@ -31,6 +41,16 @@ class RequestStack
3141
*/
3242
public function push(Request $request)
3343
{
44+
if (!$this->requests) {
45+
if ($this->resetNeeded && $this->resettableServices) {
46+
foreach ($this->resettableServices as $id => $service) {
47+
$service->{$this->resetMethods[$id]}();
48+
}
49+
} else {
50+
$this->resetNeeded = true;
51+
}
52+
}
53+
3454
$this->requests[] = $request;
3555
}
3656

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Symfony\Component\HttpFoundation\Tests\Fixtures;
4+
5+
class ResettableService
6+
{
7+
public static $counter = 0;
8+
9+
public function reset()
10+
{
11+
++self::$counter;
12+
}
13+
}

src/Symfony/Component/HttpFoundation/Tests/RequestStackTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,15 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\HttpFoundation\Request;
1616
use Symfony\Component\HttpFoundation\RequestStack;
17+
use Symfony\Component\HttpFoundation\Tests\Fixtures\ResettableService;
1718

1819
class RequestStackTest extends TestCase
1920
{
21+
protected function setUp()
22+
{
23+
ResettableService::$counter = 0;
24+
}
25+
2026
public function testGetCurrentRequest()
2127
{
2228
$requestStack = new RequestStack();
@@ -67,4 +73,34 @@ public function testGetParentRequest()
6773
$requestStack->push($secondSubRequest);
6874
$this->assertSame($firstSubRequest, $requestStack->getParentRequest());
6975
}
76+
77+
public function testResetServicesNoOp()
78+
{
79+
$requestStack = new RequestStack(new \ArrayIterator(array(new ResettableService())), array('reset'));
80+
81+
$masterRequest = Request::create('/foo');
82+
83+
$requestStack->push($masterRequest);
84+
85+
$this->assertEquals(0, ResettableService::$counter);
86+
}
87+
88+
public function testResetServices()
89+
{
90+
$requestStack = new RequestStack(new \ArrayIterator(array(new ResettableService())), array('reset'));
91+
92+
$masterRequest = Request::create('/foo');
93+
94+
$requestStack->push($masterRequest);
95+
$this->assertEquals(0, ResettableService::$counter);
96+
97+
$requestStack->pop();
98+
$this->assertEquals(0, ResettableService::$counter);
99+
100+
$requestStack->push($masterRequest);
101+
$this->assertEquals(1, ResettableService::$counter);
102+
103+
$requestStack->push($masterRequest);
104+
$this->assertEquals(1, ResettableService::$counter);
105+
}
70106
}

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

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
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>
@@ -39,7 +38,7 @@ public function __construct($tagName = 'kernel.reset')
3938
*/
4039
public function process(ContainerBuilder $container)
4140
{
42-
if (!$container->has(ServiceResetListener::class)) {
41+
if (!$container->has('request_stack')) {
4342
return;
4443
}
4544

@@ -56,14 +55,10 @@ public function process(ContainerBuilder $container)
5655
$methods[$id] = $attributes['method'];
5756
}
5857

59-
if (empty($services)) {
60-
$container->removeDefinition(ServiceResetListener::class);
61-
62-
return;
58+
if (!empty($services)) {
59+
$container->findDefinition('request_stack')
60+
->setArgument(0, new IteratorArgument($services))
61+
->setArgument(1, $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.

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

Lines changed: 4 additions & 26 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,14 @@ public function testCompilerPass()
2424
->setPublic(true)
2525
->addTag('kernel.reset', array('method' => 'clear'));
2626

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

3232
$container->compile();
3333

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

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

6464
$container->compile();
6565
}
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-
}
8866
}

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

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

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)