Перехватить HTTP-возврат, отличный от 200 и отправить ошибку на почту?

В Symfony можно легко перехватить HTTP-возврат, отличный от 200 и отправить ошибку на почту. Для этого можно использовать событие kernel.exception.

1. Создайте сервис, который будет отвечать за отправку почты. Например, создайте класс Mailer, который будет иметь метод sendErrorEmail(), который будет принимать сообщение об ошибке и отправлять его на почту:

namespace AppService;

use SymfonyComponentMailerMailerInterface;
use SymfonyComponentMimeEmail;

class Mailer
{
    private $mailer;

    public function __construct(MailerInterface $mailer)
    {
        $this->mailer = $mailer;
    }

    public function sendErrorEmail($message)
    {
        $email = (new Email())
            ->from('[email protected]')
            ->to('[email protected]')
            ->subject('Error Occurred')
            ->text($message);

        $this->mailer->send($email);
    }
}

2. Зарегистрируйте этот сервис в config/services.yaml:

services:
    AppServiceMailer:
        arguments:
            $mailer: '@mailer'

3. Создайте слушателя событий, который будет перехватывать исключения и отправлять сообщение на почту.
Например, создайте класс ExceptionListener:

namespace AppEventListener;

use SymfonyComponentHttpKernelEventExceptionEvent;
use AppServiceMailer;

class ExceptionListener
{
    private $mailer;
    
    public function __construct(Mailer $mailer)
    {
        $this->mailer = $mailer;
    }
    
    public function onKernelException(ExceptionEvent $event)
    {
        $exception = $event->getThrowable();
        
        // Проверяем, что ответ отличается от 200
        if ($event->getResponse() && !$event->getResponse()->isSuccessful()) {
            $errorMessage = $exception->getMessage();
            
            // Отправляем сообщение об ошибке на почту
            $this->mailer->sendErrorEmail($errorMessage);
        }
    }
}

4. Зарегистрируйте слушателя событий в config/services.yaml:

services:
    AppEventListenerExceptionListener:
        arguments:
            $mailer: '@AppServiceMailer'
        tags:
            - { name: kernel.event_listener, event: kernel.exception }

Теперь, когда возникает исключение и ответ отличается от 200, будет отправлено сообщение об ошибке на почту. Вы можете настроить метод sendErrorEmail() своим образом, например, чтобы добавить больше информации об ошибке или использовать другой способ отправки сообщения (например, SwiftMailer).