<?php
namespace App\EventSubscriber;
use App\Doctrine\Logging\ChainSqlLogger;
use App\Doctrine\Logging\SlowQuerySqlLogger;
use Doctrine\DBAL\Connection;
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;
class DoctrineSlowQuerySubscriber implements EventSubscriberInterface
{
private Connection $connection;
private SlowQuerySqlLogger $slowQuerySqlLogger;
private bool $initialized = false;
public function __construct(Connection $connection, SlowQuerySqlLogger $slowQuerySqlLogger)
{
$this->connection = $connection;
$this->slowQuerySqlLogger = $slowQuerySqlLogger;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 1000],
ConsoleEvents::COMMAND => ['onConsoleCommand', 1000],
];
}
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$this->enableSlowQueryLogger();
}
public function onConsoleCommand(ConsoleCommandEvent $event): void
{
$this->enableSlowQueryLogger();
}
private function enableSlowQueryLogger(): void
{
if ($this->initialized) {
return;
}
$configuration = $this->connection->getConfiguration();
$currentLogger = $configuration->getSQLLogger();
if ($currentLogger instanceof SlowQuerySqlLogger || $currentLogger instanceof ChainSqlLogger) {
$this->initialized = true;
return;
}
if ($currentLogger !== null) {
$configuration->setSQLLogger(new ChainSqlLogger([$currentLogger, $this->slowQuerySqlLogger]));
} else {
$configuration->setSQLLogger($this->slowQuerySqlLogger);
}
$this->initialized = true;
}
}