<?php
namespace App\EventSubscriber;
use App\Service\EmailService;
use App\Utils\HelperUtil;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Security\Core\Security;
class ExceptionSubscriber implements EventSubscriberInterface
{
public function __construct(
private EmailService $emailService,
private Security $security,
private HelperUtil $helper,
protected string $adminEmail,
private KernelInterface $kernel
) {
}
public function onKernelException(ExceptionEvent $event)
{
$request = $event->getRequest();
if ($event->getThrowable()) {
$environment = $this->kernel->getEnvironment();
if ('dev' == $environment) {
// En entorno de desarrollo donde puedes ver los errores y los provocan los desarrolladores no tiene tanto sentido enviar el error por correo
return true;
}
$code = 000;
$this->helper->error(null, $event->getThrowable()->getMessage());
if (is_callable([$event->getThrowable(), 'getStatusCode'])) {
if (404 == $event->getThrowable()->getStatusCode()) {
// Por ahora solo enviariamos mail cuando son errores 500 u otros
return true;
}
$code = $event->getThrowable()->getStatusCode();
} elseif (is_callable([$event->getThrowable(), 'getCode'])) {
if (404 == $event->getThrowable()->getCode()) {
// Por ahora solo enviariamos mail cuando son errores 500 u otros
return true;
}
$code = $event->getThrowable()->getCode();
}
$referer = $request->headers->get('referer'); // get the referer, it can be empty!
if (!\is_string($referer) || !$referer) {
$refererPath = null;
}else{
$refererPath = Request::create($referer)->getPathInfo();
}
$params = [
'currentUrl' => $request->getUri(),
'usuario' => $this->security->getUser(),
'message' => $event->getThrowable()->getMessage(),
'ip' => $request->getClientIp(),
'refererUrl' => $refererPath
];
if (count($request->request->all()) > 0) {
$params['post_params'] = $request->request->all();
}
$this->emailService->envioBasico([
'asunto' => 'Error ' . $code . ' detectado',
'exception' => $event->getThrowable(),
'plantilla' => 'emails/sistema/mail_exception.html.twig',
'plantilla_params' => $params,
'to' => [$this->adminEmail],
]);
}
}
public static function getSubscribedEvents(): array
{
return [
'kernel.exception' => 'onKernelException',
];
}
}