Tworzenie i konfigurowanie agregatów z użyciem pakietu Spatie Event Sourcing

Agregat to klasa, która podejmuje decyzje oparte na przeszłych zdarzeniach.

Tworzenie Agregatu

Najprostszym sposobem utworzenia korzenia agregatu będzie użycie polecenia make:aggregate:

				
					php artisan make:aggregate AccountAggregate

				
			

Spowoduje to utworzenie klasy takiej jak ta:

				
					namespace App\Aggregates;

use Spatie\EventSourcing\AggregateRoots\AggregateRoot;

class AccountAggregate extends AggregateRoot
{
}

				
			

Pobieranie agregatu

Agregat można pobrać w następujący sposób:

				
					MyAggregate::retrieve($uuid)

				
			

Jeśli nie chcesz używać statycznej metody retrieve, możesz również pobrać agregat na zainicjowanym AggregateRoot w ten sposób:

				
					$myAggregate = new MyAggregate();
$myAggregate->loadUuid($uuid);

				
			

Metoda load jest przydatna podczas wstrzykiwania korzeni agregatów w konstruktory lub klasy, w których jest obsługiwane wstrzykiwanie metod.

				
					public function handle(MyAggregate $aggregate) {
    $aggregate->load($uuid);
    
    // ...
}

				
			

Spowoduje to pobranie wszystkich zdarzeń o określonym identyfikatorze uuid i przekazanie ich do agregatu. Na przykład zdarzenie MoneyAdded zostanie przekazane do metody applyMoneyAdded na agregacie, jeśli taka metoda istnieje.

Rejestrowanie zdarzeń

Wewnątrz agregatu możesz rejestrować nowe zdarzenia, używając funkcji recordThat. Wszystkie zdarzenia przekazywane do tej funkcji powinny implementować Spatie\EventSourcing\ShouldBeStored.

Oto przykładowe zdarzenie:

				
					use Spatie\EventSourcing\StoredEvents\ShouldBeStored;

class MoneyAdded extends ShouldBeStored
{
    /** @var int */
    private $amount;

    public function __construct(int $amount)
    {
        $this->amount = $amount;
    }
}

				
			

Wewnątrz korzenia agregatu możesz przekazać zdarzenie do recordThat:

				
					// gdzieś wewnątrz Twojego agregatu
public function addMoney(int $amount)
{
    $this->recordThat(new MoneyAdded($amount));
}

				
			

Wywołanie recordThat nie spowoduje zapisania zdarzenia w bazie danych, to nastąpi, gdy sam agregat zostanie zapisany. Jednak zarejestrowanie zdarzenia spowoduje jego natychmiastowe zastosowanie do agregatu. Na przykład, gdy zarejestrujesz zdarzenie MoneyAdded, natychmiast wywołamy applyMoneyAdded na agregacie.

Zauważ, że Twoje zdarzenie nie musi zawierać $uuid. Twój agregat jest budowany dla określonego $uuid, a pakiet zapisze ten $uuid wraz z zdarzeniem, gdy agregat zostanie zapisany.

Zapisywanie agregatów

Aby zapisać agregat, należy wywołać na nim metodę persist. Oto przykład:

				
					MyAggregate::retrieve($uuid) // spowoduje przekazanie wszystkich zdarzeń dla tego uuid do metod `apply*`
   // wywołaj metody, które rejestrują zdarzenia
   ->persist(); //

				
			

Zapisywanie korzenia agregatu spowoduje zapisanie wszystkich nowo zarejestrowanych zdarzeń do bazy danych. Nowo zapisane zdarzenia zostaną przekazane do wszystkich projektorów i reaktorów.

Domyślnie zdarzenie nie zostanie wywołane na szynie zdarzeń Laravela. Aby wysyłać zdarzenia, gdy są przechowywane, można ustawić wartość dispatch_events_from_aggregate_roots w pliku konfiguracyjnym event-sourcing na true.

Podsumowanie

Agregaty są kluczowym elementem modelowania domeny w aplikacjach opartych na zdarzeniach. Używając pakietu Spatie Event Sourcing, możemy łatwo tworzyć, pobierać, rejestrować zdarzenia i zapisywać agregaty w bazie danych. Dzięki temu podejściu możemy skutecznie zarządzać stanem aplikacji i rejestrować zmiany w systemie. Pamiętaj, żeby stosować te techniki zgodnie z zasadami projektowania DDD (Domain Driven Design) i zrozumieniem potrzeb biznesowych aplikacji.