8000 [MonologBridge] Add support for subrequests in RouteProcessor · symfony/symfony@803dc25 · GitHub
[go: up one dir, main page]

Skip to content

Commit 803dc25

Browse files
committed
[MonologBridge] Add support for subrequests in RouteProcessor
1 parent 24e7534 commit 803dc25

File tree

2 files changed

+83
-12
lines changed

2 files changed

+83
-12
lines changed

src/Symfony/Bridge/Monolog/Processor/RouteProcessor.php

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Bridge\Monolog\Processor;
1313

1414
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
15+
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
1516
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
1617
use Symfony\Component\HttpKernel\KernelEvents;
1718

@@ -22,7 +23,7 @@
2223
*/
2324
class RouteProcessor implements ProcessorInterface, EventSubscriberInterface
2425
{
25-
private $routeData;
26+
private $routeData = array();
2627
private $includeParams;
2728

2829
public function __construct(bool $includeParams = true)
@@ -32,8 +33,8 @@ public function __construct(bool $includeParams = true)
3233

3334
public function __invoke(array $records)
3435
{
35-
if (null !== $this->routeData && !isset($records['extra']['route'])) {
36-
$records['extra']['route'] = $this->routeData;
36+
if (!empty($this->routeData) && !isset($records['extra']['requests'])) {
37+
$records['extra']['requests'] = $this->routeData;
3738
}
3839

3940
return $records;
@@ -42,25 +43,36 @@ public function __invoke(array $records)
4243
public function onKernelRequest(GetResponseEvent $event)
4344
{
4445
$request = $event->getRequest();
45-
4646
if (!$request->attributes->has('_controller')) {
4747
return;
4848
}
4949

50-
$this->routeData = array(
50+
$currentRequestData = array(
5151
'controller' => $request->attributes->get('_controller'),
5252
'route' => $request->attributes->get('_route'),
5353
);
5454

5555
if ($this->includeParams) {
56-
$this->routeData['route_params'] = $request->attributes->get('_route_params');
56+
$currentRequestData['route_params'] = $request->attributes->get('_route_params');
57+
}
58+
59+
$this->routeData[] = $currentRequestData;
60+
}
61+
62+
public function onKernelFinishRequest(FinishRequestEvent $event)
63+
{
64+
if (!$event->getRequest()->attributes->has('_controller')) {
65+
return;
5766
}
67+
68+
array_pop($this->routeData);
5869
}
5970

6071
public static function getSubscribedEvents()
6172
{
6273
return array(
6374
KernelEvents::REQUEST => array('onKernelRequest', 1),
75+
KernelEvents::FINISH_REQUEST => array('onKernelFinishRequest', 1),
6476
);
6577
}
6678
}

src/Symfony/Bridge/Monolog/Tests/Processor/RouteProcessorTest.php

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Bridge\Monolog\Processor\RouteProcessor;
1616
use Symfony\Component\HttpFoundation\ParameterBag;
17+
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
1718
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
1819

1920
class RouteProcessorTest extends TestCase
@@ -29,10 +30,11 @@ public function testProcessor()
2930

3031
$record = $processor(array('extra' => array()));
3132

32-
$this->assertArrayHasKey('route', $record['extra']);
33+
$this->assertArrayHasKey('requests', $record['extra']);
34+
$this->assertCount(1, $record['extra']['requests']);
3335
$this->assertEquals(
3436
array('controller' => self::TEST_CONTROLLER, 'route' => self::TEST_ROUTE, 'route_params' => self::TEST_PARAMS),
35-
$record['extra']['route']
37+
$record['extra']['requests'][0]
3638
);
3739
}
3840

@@ -43,13 +45,59 @@ public function testProcessorWithoutParams()
4345

4446
$record = $processor(array('extra' => array()));
4547

46-
$this->assertArrayHasKey('route', $record['extra']);
48+
$this->assertArrayHasKey('requests', $record['extra']);
49+
$this->assertCount(1, $record['extra']['requests']);
4750
$this->assertEquals(
4851
array('controller' => self::TEST_CONTROLLER, 'route' => self::TEST_ROUTE),
49-
$record['extra']['route']
52+
$record['extra']['requests'][0]
5053
);
5154
}
5255

56+
public function testProcessorWithSubRequests()
57+
{
58+
$controllerFromSubRequest = 'OtherController::otherMethod';
59+
60+
$processor = new RouteProcessor(false);
61+
$processor->onKernelRequest($this->getFilledRequestEvent());
62+
$processor->onKernelRequest($this->getFilledRequestEvent($controllerFromSubRequest));
63+
64+
$record = $processor(array('extra' => array()));
65+
66+
$this->assertArrayHasKey('requests', $record['extra']);
67+
$this->assertCount(2, $record['extra']['requests']);
68+
$this->assertEquals(
69+
array('controller' => self::TEST_CONTROLLER, 'route' => self::TEST_ROUTE),
70+
$record['extra']['requests'][0]
71+
);
72+
$this->assertEquals(
73+
array('controller' => $controllerFromSubRequest, 'route' => self::TEST_ROUTE),
74+
$record['extra']['requests'][1]
75+
);
76+
}
77+
78+
public function testFinishRequestRemovesLastEntry()
79+
{
80+
$controllerFromSubRequest = 'OtherController::otherMethod';
81+
82+
$processor = new RouteProcessor(false);
83+
$processor->onKernelRequest($this->getFilledRequestEvent());
84+
$processor->onKernelRequest($this->getFilledRequestEvent($controllerFromSubRequest));
85+
$processor->onKernelFinishRequest($this->getFinishRequestEvent());
86+
$record = $processor(array('extra' => array()));
87+
88+
$this->assertArrayHasKey('requests', $record['extra']);
89+
$this->assertCount(1, $record['extra']['requests']);
90+
$this->assertEquals(
91+
array('controller' => self::TEST_CONTROLLER, 'route' => self::TEST_ROUTE),
92+
$record['extra']['requests'][0]
93+
);
94+
95+
$processor->onKernelFinishRequest($this->getFinishRequestEvent());
96+
$record = $processor(array('extra' => array()));
97+
98+
$this->assertArrayNotHasKey('requests', $record['extra']);
99+
}
100+
53101
public function testProcessorWithEmptyRequest()
54102
{
55103
$processor = new RouteProcessor();
@@ -67,6 +115,17 @@ public function testProcessorDoesNothingWhenNoRequest()
67115
$this->assertEquals(array('extra' => array()), $record);
68116
}
69117

118+
private function getFinishRequestEvent(array $attributes = array('_controller' => 'test::test')): FinishRequestEvent
119+
{
120+
$request = new \stdClass();
121+
$request->attributes = new ParameterBag($attributes);
122+
123+
$event = $this->getMockBuilder(FinishRequestEvent::class)->disableOriginalConstructor()->getMock();
124+
$event->method('getRequest')->willReturn($request);
125+
126+
return $event;
127+
}
128+
70129
private function getRequestEvent(array $attributes): GetResponseEvent
71130
{
72131
$request = new \stdClass();
@@ -83,11 +142,11 @@ private function getEmptyRequestEvent(): GetResponseEvent
83142
return $this->getRequestEvent(array());
84143
}
85144

86-
private function getFilledRequestEvent(): GetResponseEvent
145+
private function getFilledRequestEvent(string $controller = self::TEST_CONTROLLER): GetResponseEvent
87146
{
88147
return $this->getRequestEvent(
89148
array(
90-
'_controller' => self::TEST_CONTROLLER,
149+
'_controller' => $controller,
91150
'_route' => self::TEST_ROUTE,
92151
'_route_params' => self::TEST_PARAMS,
93152
)

0 commit comments

Comments
 (0)
0