<?php
namespace App\EventSubscriber;
use App\Entity\DBCRM\Ajustes\ConfigGlobal;
use App\Service\EmailService;
use App\Utils\HelperUtil;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
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 EntityManagerInterface $em,
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;
/*if (!array_key_exists('softdeleteable', $this->em->getFilters()->getEnabledFilters())) {
$this->em->getFilters()->enable('softdeleteable');
}*/
$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();
}
$params = [
'asunto' => 'Error ' . $code . ' detectado',
'exception' => $event->getThrowable(),
'plantilla' => 'emails/sistema/mail_exception.html.twig',
'plantilla_params' => [
'currentUrl' => $request->getUri(),
'usuario' => $this->security->getUser(),
'message' => $event->getThrowable()->getMessage(),
'ip' => $request->getClientIp(),
],
'to' => $this->adminEmail,
'cco' => [],
];
$this->emailService->envioBasico($params);
}
}
public static function getSubscribedEvents(): array
{
return [
'kernel.exception' => 'onKernelException',
];
}
}