<?php
namespace App\Sentry;
use Sentry\State\HubInterface;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
final class SentryComponentSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly ComponentContext $componentContext,
private readonly HubInterface $hub,
) {}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 100],
KernelEvents::TERMINATE => 'reset',
ConsoleEvents::COMMAND => ['onConsoleCommand', 100],
ConsoleEvents::TERMINATE => 'reset',
];
}
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$this->applyComponent(Component::Web);
}
public function onConsoleCommand(ConsoleCommandEvent $event): void
{
$command = $event->getCommand();
if (null !== $command && 'messenger:consume' === $command->getName()) {
return;
}
$this->applyComponent(Component::Cli);
}
public function reset(): void
{
$this->componentContext->reset();
}
private function applyComponent(Component $component): void
{
$this->componentContext->set($component);
$this->hub->configureScope(static function ($scope) use ($component): void {
$scope->setTag('component', $component->value);
});
}
}