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:51a87f43178acd3b3ff89c15a32b29e8a645b843.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
}
}