Webhook

Дата обновления перевода 2024-08-01

Webhook

Компонент Webhook используется для ответа на удаленные веб-хуки для запуска действий в вашем приложении. Этот документ посвящен использованию веб-хуков для прослушивания удаленных событий в других компонентах Symfony.

Установка

1
$ composer require symfony/webhook

Использование в сочетании с компонентом Mailer

При использовании стороннего поставщика почтовых услуг можно использовать компонент Webhook для для получения вызовов веб-хуков от этого поставщика.

В настоящее время следующие сторонние поставщики почтовых услуг поддерживают веб-хуки:

???????? ?????? ??? ??????? ???????
Brevo mailer.webhook.request_parser.brevo
MailerSend mailer.webhook.request_parser.mailersend
Mailgun mailer.webhook.request_parser.mailgun
Mailjet mailer.webhook.request_parser.mailjet
Postmark mailer.webhook.request_parser.postmark
Resend mailer.webhook.request_parser.resend
Sendgrid mailer.webhook.request_parser.sendgrid

7.1

Поддержка для Resend и MailerSend была представлена в Symfony 7.1.

Note

Установите сторонний поставщик почтовых услуг, который вы хотите использовать, как описано
документации компонента Mailer . В качестве примера в этом документе используется поставщик Mailgun.

Чтобы подключить поставщика к вашему приложению, необходимо сконфигурировать маршрутизацию компонента Webhook:

1
2
3
4
5
6
7
# config/packages/framework.yaml
framework:
    webhook:
        routing:
            mailer_mailgun:
                service: 'mailer.webhook.request_parser.mailgun'
                secret: '%env(MAILER_MAILGUN_SECRET)%'

В этом примере мы используем mailer_mailgun в качестве имени маршрутизации веб-хука. Имя маршрутизации должно быть уникальным, поскольку именно оно связывает поставщика с вашим кодом потребителя веб-хука.

Имя маршрутизации веб-хука является частью URL-адреса, который необходимо сконфигурировать в стороннем поставщике почтовых услуг. URL-адрес представляет собой конкатенацию вашего доменного имени и имени маршрутизации, которое вы выбрали в конфигурации (например, https://example.com/webhook/mailer_mailgun.

Для Mailgun вы получите секрет для веб-хука. Сохраните этот секрет как MAILER_MAILGUN_SECRET (в :doc:88564b30eb86f29aa14d7de932983753d7a828c6.env``).

После этого добавьте потребителя RemoteEvent,
чтобы реагировать на входящие веб-хуки (имя маршрутизации веб-хука - это то, что связывает ваш класс с поставщиком).

Для веб-хуков почтового сервера реагируйте на события MailerDeliveryEvent или MailerEngagementEvent:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use Symfony\Component\RemoteEvent\Attribute\AsRemoteEventConsumer;
use Symfony\Component\RemoteEvent\Consumer\ConsumerInterface;
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
use Symfony\Component\RemoteEvent\RemoteEvent;

#[AsRemoteEventConsumer('mailer_mailgun')]
class WebhookListener implements ConsumerInterface
{
    public function consume(RemoteEvent $event): void
    {
        if ($event instanceof MailerDeliveryEvent) {
            $this->handleMailDelivery($event);
        } elseif ($event instanceof MailerEngagementEvent) {
            $this->handleMailEngagement($event);
        } else {
            // This is not an email event
            return;
        }
    }

    private function handleMailDelivery(MailerDeliveryEvent $event): void
    {
        // Обработать событие доставки почты
    }

    private function handleMailEngagement(MailerEngagementEvent $event): void
    {
        // Обработать событие привлечения почты
    }
}

Использование в сочетании с компонентом Notifier

Использование компонента Webhook при использовании стороннего транспорта в Notifier очень похоже на использование в Mailer.

В настоящее время следующие сторонние SMS-транспорты поддерживают веб-хуки:

SMS-?????? ??? ??????? ???????
Twilio notifier.webhook.request_parser.twilio
Vonage notifier.webhook.request_parser.vonage

Для SMS веб-хуков реагируйте на событие SmsEvent:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use Symfony\Component\RemoteEvent\Attribute\AsRemoteEventConsumer;
use Symfony\Component\RemoteEvent\Consumer\ConsumerInterface;
use Symfony\Component\RemoteEvent\Event\Sms\SmsEvent;
use Symfony\Component\RemoteEvent\RemoteEvent;

#[AsRemoteEventConsumer('notifier_twilio')]
class WebhookListener implements ConsumerInterface
{
    public function consume(RemoteEvent $event): void
    {
        if ($event instanceof SmsEvent) {
            $this->handleSmsEvent($event);
        } else {
            // Это не является событием SMS
            return;
        }
    }

    private function handleSmsEvent(SmsEvent $event): void
    {
        // Обработать событие SMS
    }
}