Przykład użycia dedykowanej klasy do obsługi zdarzenia

Załóżmy, że mamy zdarzenie MoneyAdded, które reprezentuje dodanie środków do konta. Chcemy, aby po wystąpieniu tego zdarzenia, odpowiednia klasa obsługująca dodawanie środków do konta została automatycznie wywołana.

Najpierw definiujemy nasze zdarzenie MoneyAdded:

				
					namespace App\Events;

use Illuminate\Foundation\Events\Dispatchable;

class MoneyAdded
{
    use Dispatchable;

    public $account;
    public $amount;

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

				
			

Następnie tworzymy dedykowaną klasę do obsługi dodawania środków do konta:

				
					namespace App\Handlers;

use App\Events\MoneyAdded;

class AddMoneyToAccountHandler
{
    public function __invoke(MoneyAdded $event)
    {
        $event->account->addMoney($event->amount);
    }
}

				
			

Teraz możemy zarejestrować nasz projektor, który będzie używać tej klasy obsługującej zdarzenie:

				
					namespace App\Projectors;

use App\Events\MoneyAdded;
use App\Handlers\AddMoneyToAccountHandler;
use Spatie\EventSourcing\EventHandlers\Projectors\Projector;

class AccountBalanceProjector extends Projector
{
    protected array $handlesEvents = [
        MoneyAdded::class => AddMoneyToAccountHandler::class,
    ];
}

				
			

W ten sposób, po wystąpieniu zdarzenia MoneyAdded, klasa AddMoneyToAccountHandler zostanie automatycznie wywołana, co pozwoli na dodanie środków do konta. Ten sposób organizacji kodu jest bardziej czytelny i pozwala na łatwiejsze zarządzanie obsługą zdarzeń w projektorach.