Новое в Symfony 6.3 — Компоненты Webhook и RemoteEvent

Источник: «New in Symfony 6.3: Webhook and RemoteEvent Components»
Symfony 6.3 представляет несколько новых компонентов, упрощающих создание и обработку веб-хуков в ваших приложениях.

Веб-хуки — определяемые пользователем HTTP обратные вызовы (callback). Они позволяют другим сервисам оповещать вас о внешних событиях, чтобы вы могли реагировать на них. Например, рассмотрим веб-сайт packagist.org, на котором публикуется информация о PHP пакетах. Без веб-хуков этому сайту пришлось бы неоднократно вызывать GitHub, GitLab и т.д., чтобы узнать, изменились ли репозитории кода ваших пакетов.

Вместо этого packagist.org предоставляет веб-хуки, которые GitHub и другие могут вызывать для отправки сведений о вашем пакете всякий раз, когда вы отправляете новый код. Таким образом, изменения распространяются почти сразу, и ни один из этих сайтов не тратит ресурсы, опрашивая другие сайты, не изменилось ли что-то с прошлого раза.

Веб-хуки настолько распространены и удобны, что в Symfony 6.3 мы добавляем новый компонент Webhook и новый компонент RemoteEvent. В Symfony вы определяете веб-хук как парсер + потребитель. Во-первых, вы создаёте парсер, способный обрабатывать веб-хуки определённого типа:

namespace App\Webhook;

use Symfony\Component\HttpFoundation\ChainRequestMatcher;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcher\HostRequestMatcher;
use Symfony\Component\HttpFoundation\RequestMatcher\IsJsonRequestMatcher;
use Symfony\Component\HttpFoundation\RequestMatcher\MethodRequestMatcher;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;
use Symfony\Component\RemoteEvent\Exception\ParseException;
use Symfony\Component\Webhook\Client\AbstractRequestParser;
use Symfony\Component\Webhook\Exception\RejectWebhookException;

final class MailerWebhookParser extends AbstractRequestParser
{
protected function getRequestMatcher(): RequestMatcherInterface
{
// они определяют условия, которым должен соответствовать входящий веб-хук запрос,
// чтобы он мог быть обработан этим парсером
return new ChainRequestMatcher([
new HostRequestMatcher('github.com'),
new IsJsonRequestMatcher(),
new MethodRequestMatcher('POST'),
]);
}

protected function doParse(Request $request, string $secret): ?RemoteEvent
{
// в этом методе вы проверяете полезную нагрузку запроса, что бы увидеть,
// содержит ли она необходимую информацию для обработки это веб-хука
$content = $request->toArray();
if (!isset($content['signature']['token'])) {
throw new RejectWebhookException(406, 'Payload is malformed.');
}

// вы можете вернуть либо `null`, либо объект `RemoteEvent`
return new RemoteEvent('mailer_callback.event', 'event-id', $content);
}
}

Затем вы создаёте потребительский класс, способный обрабатывать удалённое (remote) событие, имя которого совпадает с именем, возвращаемым парсером (в этом примере событие mailer_callback.event):

use Symfony\Component\RemoteEvent\Attribute\AsRemoteEventConsumer;
use Symfony\Component\RemoteEvent\RemoteEvent;

#[AsRemoteEventConsumer(name: 'mailer_callback.event')]
class MailerCallbackEventConsumer
{
public function consume(RemoteEvent $event): void
{
// Обработать событие, возвращённое вашим парсером
}
}

В этом примере показаны только самые основные функции новых компонентов, но есть и многое другое. Мы всё ещё готовим документацию по этим компонентам, а пока вы можете посмотреть выступление Fabien Potencier Keynote: Introducing the RemoteEvent and Webhook components

Дополнительные материалы

Предыдущая Статья

Как безопасно использовать Laravel Фасады

Следующая Статья

Как узнать какую версию Laravel вы используете