<?php
declare(strict_types=1);
namespace Sentry\SentryBundle\EventListener;
use Sentry\State\HubInterface;
use Sentry\State\Scope;
use Sentry\UserDataBag;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
/**
* This listener ensures that a new {@see \Sentry\State\Scope} is created for
* each request and that it is filled with useful information, e.g. the IP
* address of the client.
*/
final class RequestListener
{
use KernelEventForwardCompatibilityTrait;
/**
* @var HubInterface The current hub
*/
private $hub;
/**
* Constructor.
*
* @param HubInterface $hub The current hub
*/
public function __construct(HubInterface $hub/* , ?TokenStorageInterface $tokenStorage */)
{
$this->hub = $hub;
}
/**
* This method is called for each request handled by the framework and
* fills the Sentry scope with information about the current user.
*
* @param RequestEvent $event The event
*/
public function handleKernelRequestEvent(RequestEvent $event): void
{
if (!$this->isMainRequest($event)) {
return;
}
$client = $this->hub->getClient();
if (null === $client || !$client->getOptions()->shouldSendDefaultPii()) {
return;
}
$this->hub->configureScope(static function (Scope $scope) use ($event): void {
$user = $scope->getUser() ?? new UserDataBag();
if (null === $user->getIpAddress()) {
$user->setIpAddress($event->getRequest()->getClientIp());
}
$scope->setUser($user);
});
}
/**
* This method is called for each request handled by the framework and
* sets the route on the current Sentry scope.
*
* @param ControllerEvent $event The event
*/
public function handleKernelControllerEvent(ControllerEvent $event): void
{
if (!$this->isMainRequest($event)) {
return;
}
$route = $event->getRequest()->attributes->get('_route');
if (!\is_string($route)) {
return;
}
$this->hub->configureScope(static function (Scope $scope) use ($route): void {
$scope->setTag('route', $route);
});
}
}