Webhook
Webhook 组件用于响应远程 webhook,以触发应用程序中的操作。本文档重点介绍如何使用 webhook 监听其他 Symfony 组件中的远程事件。
安装
1
$ composer require symfony/webhook
与 Mailer 组件结合使用
当使用第三方邮件服务提供商时,你可以使用 Webhook 组件来接收来自该提供商的 webhook 调用。
目前,以下第三方邮件服务提供商支持 webhook
邮件服务 | 解析器服务名称 |
---|---|
Brevo | mailer.webhook.request_parser.brevo |
Mandrill | mailer.webhook.request_parser.mailchimp |
MailerSend | mailer.webhook.request_parser.mailersend |
Mailgun | mailer.webhook.request_parser.mailgun |
Mailjet | mailer.webhook.request_parser.mailjet |
Mailomat | mailer.webhook.request_parser.mailomat |
Mailtrap | mailer.webhook.request_parser.mailtrap |
Postmark | mailer.webhook.request_parser.postmark |
Resend | mailer.webhook.request_parser.resend |
Sendgrid | mailer.webhook.request_parser.sendgrid |
Sweego | mailer.webhook.request_parser.sweego |
7.1
对 Resend
和 MailerSend
的支持在 Symfony 7.1 中引入。
7.2
Mandrill
, Mailomat
, Mailtrap
, 和 Sweego
的集成在 Symfony 7.2 中引入。
注意
按照 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
作为 webhook 路由名称。路由名称必须是唯一的,因为它将提供商与你的 webhook 消费者代码连接起来。
webhook 路由名称是你需要在第三方邮件服务提供商处配置的 URL 的一部分。该 URL 是你的域名和你配置中选择的路由名称的组合(例如 https://example.com/webhook/mailer_mailgun
)。
对于 Mailgun,你将获得一个 webhook 密钥。将此密钥存储为 MAILER_MAILGUN_SECRET(在 密钥管理系统 或 .env
文件中)。
完成后,添加一个 RemoteEvent 消费者来响应传入的 webhook(webhook 路由名称是将你的类连接到提供商的桥梁)。
对于邮件 webhook,响应 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
{
// Handle the mail delivery event
}
private function handleMailEngagement(MailerEngagementEvent $event): void
{
// Handle the mail engagement event
}
}
与 Notifier 组件结合使用
当在 Notifier 中使用第三方传输时,Webhook 组件的用法与 Mailer 非常相似。
目前,以下第三方 SMS 传输支持 webhook
SMS 服务 | 解析器服务名称 |
---|---|
Twilio | notifier.webhook.request_parser.twilio |
Sweego | notifier.webhook.request_parser.sweego |
Vonage | notifier.webhook.request_parser.vonage |
对于 SMS webhook,响应 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 {
// This is not an SMS event
return;
}
}
private function handleSmsEvent(SmsEvent $event): void
{
// Handle the SMS event
}
}
创建自定义 Webhook
提示
从 MakerBundle v1.58.0
开始,你可以运行 php bin/console make:webhook
来生成创建自定义 Webhook 所需的请求解析器和消费者文件。