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 所需的請求解析器和消費者檔案。