Skip to content

Commit 0c6cea7

Browse files
committed
Rewire the listeners
1 parent e90c809 commit 0c6cea7

File tree

4 files changed

+68
-18
lines changed

4 files changed

+68
-18
lines changed

src/DependencyInjection/SentryExtension.php

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
use Sentry\Options;
1010
use Sentry\SentryBundle\ErrorTypesParser;
1111
use Sentry\SentryBundle\EventListener\ErrorListener;
12+
use Sentry\SentryBundle\EventListener\RequestListener;
13+
use Sentry\SentryBundle\EventListener\SubRequestListener;
1214
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
1315
use Symfony\Component\Config\FileLocator;
1416
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -18,6 +20,7 @@
1820
use Symfony\Component\DependencyInjection\Reference;
1921
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
2022
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
23+
use Symfony\Component\HttpKernel\Event\RequestEvent;
2124
use Symfony\Component\HttpKernel\KernelEvents;
2225

2326
/**
@@ -27,6 +30,8 @@
2730
*/
2831
class SentryExtension extends Extension
2932
{
33+
private const KERNEL_EVENT_LISTENER = 'kernel.event_listener';
34+
3035
/**
3136
* {@inheritDoc}
3237
*
@@ -165,18 +170,32 @@ private function configureErrorListener(ContainerBuilder $container, array $proc
165170
*/
166171
private function tagExceptionListener(ContainerBuilder $container): void
167172
{
168-
$listener = $container->getDefinition(ErrorListener::class);
173+
$errorListener = $container->getDefinition(ErrorListener::class);
169174
$method = class_exists(ExceptionEvent::class) && method_exists(ExceptionEvent::class, 'getThrowable')
170175
? 'onException'
171176
: 'onKernelException';
172-
173-
$tagAttributes = [
177+
$errorListener->addTag(self::KERNEL_EVENT_LISTENER, [
174178
'event' => KernelEvents::EXCEPTION,
175179
'method' => $method,
176180
'priority' => '%sentry.listener_priorities.request_error%',
177-
];
181+
]);
182+
183+
$requestListener = $container->getDefinition(RequestListener::class);
184+
$method = class_exists(RequestEvent::class)
185+
? 'onRequest'
186+
: 'onKernelRequest';
187+
$requestListener->addTag(self::KERNEL_EVENT_LISTENER, [
188+
'event' => KernelEvents::REQUEST,
189+
'method' => $method,
190+
'priority' => '%sentry.listener_priorities.request%',
191+
]);
178192

179-
$listener->addTag('kernel.event_listener', $tagAttributes);
193+
$subrequestListener = $container->getDefinition(SubRequestListener::class);
194+
$subrequestListener->addTag(self::KERNEL_EVENT_LISTENER, [
195+
'event' => KernelEvents::REQUEST,
196+
'method' => $method,
197+
'priority' => '%sentry.listener_priorities.sub_request%',
198+
]);
180199
}
181200

182201
private function configureMonologHandler(ContainerBuilder $container, array $monologConfiguration): void

src/Resources/config/services.xml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@
4141
<argument type="service" id="Sentry\State\HubInterface" />
4242
<argument type="service" id="security.token_storage" on-invalid="ignore" />
4343

44-
<tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="%sentry.listener_priorities.request%" />
45-
<tag name="kernel.event_listener" event="kernel.controller" method="onKernelController" priority="%sentry.listener_priorities.request%" />
44+
<!-- The following tags are done manually in PHP for BC with Symfony < 4.3, -->
45+
<!-- <tag name="kernel.event_listener" event="kernel.request" method="onRequest" priority="%sentry.listener_priorities.request%" />-->
46+
<!-- <tag name="kernel.event_listener" event="kernel.controller" method="onController" priority="%sentry.listener_priorities.request%" />-->
4647
</service>
4748

4849
<service id="Sentry\SentryBundle\EventListener\SubRequestListener" class="Sentry\SentryBundle\EventListener\SubRequestListener" public="false">
49-
<tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="%sentry.listener_priorities.sub_request%" />
50-
<tag name="kernel.event_listener" event="kernel.finish_request" method="onKernelFinishRequest" priority="%sentry.listener_priorities.sub_request%" />
50+
<!-- The following tag is done manually in PHP for BC with Symfony < 4.3, -->
51+
<!-- <tag name="kernel.event_listener" event="kernel.request" method="onRequest" priority="%sentry.listener_priorities.sub_request%" />-->
52+
<tag name="kernel.event_listener" event="kernel.finish_request" method="onFinishRequest" priority="%sentry.listener_priorities.sub_request%" />
5153
</service>
5254

5355
<service id="Sentry\SentryBundle\Command\SentryTestCommand" class="Sentry\SentryBundle\Command\SentryTestCommand" public="false">

test/EventListener/RequestListenerTest.php

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
use Symfony\Component\HttpFoundation\Request;
1515
use Symfony\Component\HttpKernel\Event\ControllerEvent;
1616
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
17+
use Symfony\Component\HttpKernel\Event\KernelEvent;
18+
use Symfony\Component\HttpKernel\Event\RequestEvent;
1719
use Symfony\Component\HttpKernel\KernelInterface;
1820
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
1921
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
@@ -79,7 +81,7 @@ public function testOnKernelRequestUserDataIsSetToScope($user): void
7981
$tokenStorage->reveal()
8082
);
8183

82-
$listener->onKernelRequest($event);
84+
$this->callOnRequest($listener, $event);
8385

8486
$expectedUserData = [
8587
'ip_address' => '1.2.3.4',
@@ -110,7 +112,7 @@ public function testOnKernelRequestUserDataIsNotSetIfSendPiiIsDisabled(): void
110112
$tokenStorage->reveal()
111113
);
112114

113-
$listener->onKernelRequest($event);
115+
$this->callOnRequest($listener, $event);
114116

115117
$this->assertEquals([], $this->getUserContext($this->currentScope));
116118
}
@@ -130,7 +132,7 @@ public function testOnKernelRequestUserDataIsNotSetIfNoClientIsPresent(): void
130132
$tokenStorage->reveal()
131133
);
132134

133-
$listener->onKernelRequest($event);
135+
$this->callOnRequest($listener, $event);
134136

135137
$this->assertEquals([], $this->getUserContext($this->currentScope));
136138
}
@@ -148,7 +150,7 @@ public function testOnKernelRequestUsernameIsNotSetIfTokenStorageIsAbsent(): voi
148150
null
149151
);
150152

151-
$listener->onKernelRequest($event);
153+
$this->callOnRequest($listener, $event);
152154

153155
$expectedUserData = [
154156
'ip_address' => '1.2.3.4',
@@ -173,7 +175,7 @@ public function testOnKernelRequestUsernameIsNotSetIfTokenIsAbsent(): void
173175
$tokenStorage->reveal()
174176
);
175177

176-
$listener->onKernelRequest($event);
178+
$this->callOnRequest($listener, $event);
177179

178180
$expectedUserData = [
179181
'ip_address' => '1.2.3.4',
@@ -205,7 +207,7 @@ public function testOnKernelRequestUsernameIsNotSetIfTokenIsNotAuthenticated():
205207
$tokenStorage->reveal()
206208
);
207209

208-
$listener->onKernelRequest($event);
210+
$this->callOnRequest($listener, $event);
209211

210212
$expectedUserData = [
211213
'ip_address' => '1.2.3.4',
@@ -230,7 +232,7 @@ public function testOnKernelRequestUsernameIsNotSetIfUserIsNotRemembered(): void
230232
$tokenStorage->reveal()
231233
);
232234

233-
$listener->onKernelRequest($event);
235+
$this->callOnRequest($listener, $event);
234236

235237
$expectedUserData = [
236238
'ip_address' => '1.2.3.4',
@@ -285,7 +287,7 @@ public function testOnKernelRequestUserDataAndTagsAreNotSetInSubRequest(): void
285287
$tokenStorage->reveal()
286288
);
287289

288-
$listener->onKernelRequest($event);
290+
$this->callOnRequest($listener, $event);
289291

290292
$this->assertEmpty($this->getUserContext($this->currentScope));
291293
$this->assertEmpty($this->getTagsContext($this->currentScope));
@@ -327,6 +329,19 @@ private function createControllerEvent(Request $request)
327329

328330
return $event;
329331
}
332+
333+
/**
334+
* @param RequestListener $listener
335+
* @param KernelEvent $event
336+
*/
337+
private function callOnRequest(RequestListener $listener, $event): void
338+
{
339+
if (class_exists(RequestEvent::class)) {
340+
$listener->onRequest($event);
341+
} else {
342+
$listener->onKernelRequest($event);
343+
}
344+
}
330345
}
331346

332347
class UserWithInterface implements UserInterface

test/EventListener/SubRequestListenerTest.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Sentry\State\Scope;
1010
use Symfony\Component\HttpFoundation\Request;
1111
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
12+
use Symfony\Component\HttpKernel\Event\RequestEvent;
1213
use Symfony\Component\HttpKernel\KernelInterface;
1314

1415
class SubRequestListenerTest extends BaseTestCase
@@ -31,7 +32,7 @@ public function testOnKernelRequestWithMasterRequest(): void
3132
$this->currentHub->pushScope()
3233
->shouldNotBeCalled();
3334

34-
$listener->onKernelRequest($masterRequestEvent);
35+
$this->callOnRequest($listener, $masterRequestEvent);
3536
}
3637

3738
public function testOnKernelRequestWithSubRequest(): void
@@ -80,4 +81,17 @@ private function createFinishRequestEvent(int $type): FinishRequestEvent
8081
$type
8182
);
8283
}
84+
85+
/**
86+
* @param SubRequestListener $listener
87+
* @param $event
88+
*/
89+
private function callOnRequest(SubRequestListener $listener, $event): void
90+
{
91+
if (class_exists(RequestEvent::class)) {
92+
$listener->onRequest($event);
93+
} else {
94+
$listener->onKernelRequest($event);
95+
}
96+
}
8397
}

0 commit comments

Comments
 (0)