Webhook

Дата оновлення перекладу 2024-06-11

Webhook

Компонент Webhook використовується для реагування на віддалені веб-хуки для запуску дій у вашому додатку. У цьому документі зосереджено увагу на використанні веб-хуків для прослуховування віддалених подій в інших компонентах Symfony.

Установка

1
$ composer require symfony/webhook

Використання у поєднанні з компонентом Mailer

Якщо ви використовуєте стороннього постачальника поштових послуг, ви можете використовувати компонент Webhook, щоб отримувати виклики веб-хуків від цього постачальника.

Наразі веб-хуки підтримують наступні сторонні поштові постачальники:

?????? Mailer ??'? ??????? ???????
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 (у системі управління секретами або у файлі .env).

Після цього додайте споживача RemoteEvent`, щоб реагувати на вхідні веб-хуки (ім'я маршрутизації вебхука - це те, що з'єднує ваш клас з постачальником).

Для веб-хуків поштового сервісу, реагуйте на події
MailerDeliveryEvent або :class:`Symfony\Component\RemoteEvent\Event\Mailer\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 {
            // Це не є подією пошти
            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
    }
}