PHP Фреймворки с архитектурой Event Sourcing
Вместо того чтобы сохранять последнее состояние объекта и отбрасывать шаги, которые привели к его появлению, Event Sourcing позволяет рассматривать каждое изменение как главу в истории вашего приложения.
В динамично развивающейся экосистеме PHP такие фреймворки, как Symfony и Laravel, делают это не только возможным, но и просто приятным.
Шаг 1
Event sourcing - это запись каждого события, которое изменяет ваши данные, а не просто сохранение текущего состояния данных. Представьте, что вы ведете журнал каждого хода в шахматной партии, а не только текущей настройки доски.
Воспроизводя эти ходы, вы можете восстановить любое прошлое состояние или даже вычислить что-то совершенно новое.
Зачем беспокоиться?
Контрольные журналы, суперсилы отладки и возможность откатывать изменения или анализировать сценарии "что, если". Если это вас не впечатляет, подумайте о том, насколько чище становится ваша кодовая база, когда каждая операция изменения состояния становится явной.
Шаг 2
И Symfony, и Laravel более чем пригодны для Event Sourcing. Давайте разберем их подробнее:
- Laravel: Платформа для быстрой разработки, предлагающая отличные пакеты, такие как Laravel Event Sourcing от Spatie, упрощает внедрение.
- Symfony: Известная своей элегантностью и гибкостью, Symfony может интегрироваться с такими библиотеками, как Broadway, предоставляя вам все необходимое для начала работы с Event Sourcing.
Выберите тот, который соответствует вашему стилю, оба они подобны опытным поварам на кухне, готовым приготовить что-нибудь потрясающее.
Шаг 3
Настройка Laravel:
1. Установите пакет Spatie:
composer require spatie/laravel-event-sourcing
2. Опубликуйте конфигурационный файл.:
php artisan vendor:publish --tag=event-sourcing-config
3. Настройте классы Projector и Reactor (подробнее об этом позже).
Настройка Symfony:
1. Установите Broadway:
composer require broadway/broadway
2. Определите события вашего домена и хранилище событий.
3. Настройте свои службы для управления проекцией и обработкой команд.
Шаг 4
События домена - это сердцебиение вашей системы, основанной на Event Sourcing. Допустим, вы создаете приложение для совместного использования поездок. События могут быть:
- RideRequested
- DriverAssigned
- RideCompleted
Пример на Laravel
use Spatie\EventSourcing\StoredEvents\ShouldBeStored;
class RideRequested extends ShouldBeStored
{
public function __construct(public string $rideId, public string $userId, public string $pickupLocation)
{
}
}
Пример на Symfony
class RideRequested
{
public function __construct(public string $rideId, public string $userId, public string $pickupLocation)
{
}
}
Эти события неизменяемы, то есть, как только они сохраняются, они блокируются более надежно, чем разработчик, защищающий свои учетные данные в рабочей базе данных.
Шаг 5
Laravel упрощает это благодаря встроенному хранилищу событий. В Symfony вы создадите таблицу базы данных для событий. В любом случае:
- Используйте JSON для хранения данных о событиях.
- Включите метаданные, такие как временные метки и идентификаторы корреляции, для целей отслеживания.
Шаг 6
Проекторы являются связующим звеном между вашим журналом событий и данными, доступными для запроса. Они отслеживают события и обновляют модели считывания, думайте о них как о переводчиках, переводящих азбуку Морзе на русский язык.
Пример проектора Laravel
namespace App\Projectors;
use App\Events\RideRequested;
use Spatie\EventSourcing\Projectors\Projector;
class RideProjector extends Projector
{
public function onRideRequested(RideRequested $event): void
{
Ride::create([
'id' => $event->rideId,
'user_id' => $event->userId,
'pickup_location' => $event->pickupLocation,
]);
}
}
Аналог на Symfony
В Symfony вы могли бы использовать прослушиватели событий для достижения того же результата:
class RideProjector
{
public function onRideRequested(RideRequested $event): void
{
// Обновите БД или модель в памяти.
}
}
Шаг 7
Реакторы запускают второстепенные задачи, например, отправку уведомлений, в зависимости от конкретных событий. Они похожи на друга, который, услышав о вашем плохом дне, немедленно заказывает пиццу. Рассмотрим пример:
Для события, запрошенного RideRequested, реактор может уведомлять драйверы уведомлений:
class NotifyDriversReactor
{
public function onRideRequested(RideRequested $event): void
{
// Логика оповещения драйверов
}
}
Шаг 8
Одним из приемов event sourcing является воспроизведение событий, восстановление текущего состояния с нуля. Это особенно удобно при отладке или обновлении ваших проекций. Laravel и Symfony поддерживают это из коробки.
Команда воспроизведения в Laravel
php artisan event-sourcing:replay
Воспроизведение в Symfony
Реализуйте пользовательскую команду для циклического просмотра сохраненных событий и повторного применения их к вашим проекциям.
Шаг 9
По поводу тестирования. Тестируйте свои события, проекторы и реакторы изолированно. Используйте фейковые хранилища событий, чтобы избежать путаницы с данными на проде во время разработки.
Подведем итоги
Внедрение системы Event Sourcing в PHP это не просто ведение записей, это защита вашего приложения на будущее. Занимаетесь ли вы отладкой, аудитом или добавлением новых функций, вы будете благодарны за богатую историю данных, которую предоставляют события.
Comments
In order to leave your opinion, you need to register on the website