
Die Übersetzung des Artikels wurde für Studenten des Fachkurses "Framework Laravel" vorbereitet.
Frek Van der Herten und das Spatie-Team haben lange Zeit hart am Laravel Event Projector gearbeitet, einem Paket, mit dem Sie das Event Sourcing-Konzept auf das Laravel-Framework anwenden können. Und schließlich ist die erste stabile Version (v1.0.0) verfügbar!
Sie können Event Projector mit Composer in Ihr Projekt installieren und dank der automatischen Paketerkennung in Laravel sofort nach der Veröffentlichung von Paketmigrationen und -konfigurationen arbeiten!
composer require spatie/laravel-event-projector:^1.0.0
Event Projector benötigt PHP 7.2, daher muss Ihre Anwendung die neueste Version von PHP unterstützen, obwohl das Laravel-Framework selbst eine PHP-Version von mindestens 7.1.3 benötigt.
Was ist "Ereignisgenerierung"?
In dem Artikel Generieren von Ereignissen wird dieses Konzept wie folgt beschrieben:
Anstatt den aktuellen Status der Daten in der Domäne zu speichern, können Sie die gesamte Abfolge der für diese Daten ausgeführten Aktionen aufzeichnen. Der im Nur-Anhängen-Modus ausgeführte Speicher fügt nur Daten hinzu. Der Speicher fungiert als System von Datensätzen und kann zum Materialisieren von Domänenobjekten verwendet werden. Dies ermöglicht es uns, Aufgaben in komplexen Themenbereichen zu vereinfachen, da das Datenmodell und der Themenbereich nicht synchronisiert werden müssen, was zu einer verbesserten Skalierbarkeit, einer höheren Produktivität und einer höheren Betriebseffizienz führt. Dieser Ansatz stellt die Konsistenz der Transaktionsdaten sicher und ermöglicht es Ihnen, ein vollständiges Änderungsprotokoll und einen vollständigen Änderungsverlauf zu führen, sodass Ausgleichsmaßnahmen durchgeführt werden können.
Ich empfehle Ihnen, den gesamten Artikel zu lesen. Es enthält eine hervorragende Beschreibung dieser Vorlage, gibt Überlegungen zur ordnungsgemäßen Verwendung an und beschreibt Situationen, in denen dies nützlich sein kann.
Mir gefällt auch die Erklärung des Konzepts der Ereignisgenerierung, die in der Einleitung zur Dokumentation für Event Projector enthalten ist:
Die Generierung von Ereignissen ist in Bezug auf Daten dieselbe wie in Bezug auf Code. Die meisten Anwendungen speichern nur ihren aktuellen Status in der Datenbank. Eine erhebliche Menge nützlicher Informationen geht verloren - Sie wissen nicht, wie die Anwendung diesen Status erreicht hat.
Das Konzept der Ereignisgenerierung ist ein Versuch, dieses Problem zu lösen, indem alle Ereignisse gespeichert werden, die in Ihrer Anwendung auftreten. Der Status der Anwendung wird durch Abhören dieser Ereignisse gebildet.
Betrachten Sie zum besseren Verständnis ein kleines Beispiel aus dem Leben. Stellen Sie sich vor, Sie sind eine Bank. Ihre Kunden haben Konten. Es reicht nicht aus, nur Informationen über den Kontostand zu behalten. Sie müssen sich auch alle Transaktionen merken. Bei Verwendung der Ereignisgenerierungsvorlage ist der Kontostand nicht nur ein separates Feld in der Datenbank, sondern ein Wert, der basierend auf den gespeicherten Transaktionsinformationen berechnet wird. Dies ist nur einer der vielen Vorteile, die das Konzept der Event-Generierung bietet.
Dieses Paket soll Benutzer des Laravel-Frameworks mit dem Konzept der Ereignisgenerierung vertraut machen und dessen Verwendung in der Praxis erleichtern.
Es scheint, dass Event Projector dabei hilft, die Arbeit mit dem Ereignisgenerierungsmuster zu vereinfachen. Die Dokumentation half mir auch herauszufinden, wie ich diesen Ansatz als Teil der Konzepte des Laravel-Frameworks verwenden kann, die ich bereits kenne.
Laravel Eventing Grundlagen
Um zu verstehen, wie die Ereignisgenerierung im Event Projector-Paket funktioniert und welche Komponenten an diesem Prozess beteiligt sind, lesen Sie den Abschnitt Erstellen des ersten Projektors .
Auf hohem Niveau (verzeihen Sie mir, wenn ich in meiner Einschätzung nicht ganz richtig bin, da die Generierung von Ereignissen für mich ein neues Konzept ist) umfasst die Generierung von Ereignissen mit dem Event-Projektor:
- Beredte Modelle
- Ereignisse, die die ShouldBeStored-Schnittstelle implementieren
- Projektorklassen
Ein Beispiel für eine Modellklasse mit der statischen Methode createWithAttributes
, die in der Dokumentation bereitgestellt wird:
namespace App; use App\Events\AccountCreated; use App\Events\AccountDeleted; use App\Events\MoneyAdded; use App\Events\MoneySubtracted; use Illuminate\Database\Eloquent\Model; use Ramsey\Uuid\Uuid; class Account extends Model { protected $guarded = []; protected $casts = [ 'broke_mail_send' => 'bool', ]; public static function createWithAttributes(array $attributes): Account { $attributes['uuid'] = (string) Uuid::uuid4(); event(new AccountCreated($attributes)); return static::uuid($attributes['uuid']); } public function addMoney(int $amount) { event(new MoneyAdded($this->uuid, $amount)); } public function subtractMoney(int $amount) { event(new MoneySubtracted($this->uuid, $amount)); } public function delete() { event(new AccountDeleted($this->uuid)); } public static function uuid(string $uuid): ?Account { return static::where('uuid', $uuid)->first(); } }
Hier müssen Sie auf die Ereignisse AccountCreated
, MoneyAdded
, MoneySubtracted
und AccountDeleted
, die jeweils ausgelöst werden, um ein Konto zu eröffnen, dem Konto Geld hinzuzufügen, Geld vom Konto MoneySubtracted
und das Konto zu löschen.
Das folgende Beispiel zeigt das MoneyAdded
Ereignis (Hinzufügen von Geld zu einem Konto). Die ShouldBeStored-Schnittstelle teilt dem Event Projector-Paket mit, dass dieses Ereignis gespeichert werden soll:
namespace App\Events; use Spatie\EventProjector\ShouldBeStored; class MoneyAdded implements ShouldBeStored { public $accountUuid; public $amount; public function __construct(string $accountUuid, int $amount) { $this->accountUuid = $accountUuid; $this->amount = $amount; } }
Und schließlich ein Teilbeispiel eines Ereignishandlers innerhalb der Projektorklasse zum Auffüllen von Guthaben auf dem Konto (meine bevorzugte Art von Bankereignis):
public function onMoneyAdded(MoneyAdded $event) { $account = Account::uuid($event->accountUuid); $account->balance += $event->amount; $account->save(); }
Um all dies miteinander zu verknüpfen, betrachten Sie ein Beispiel aus der Dokumentation zum Erstellen eines neuen Kontos und zum Hinzufügen von Geldern:
Account::createWithAttributes(['name' => 'Luke']); Account::createWithAttributes(['name' => 'Leia']); $account = Account::where(['name' => 'Luke'])->first(); $anotherAccount = Account::where(['name' => 'Leia'])->first(); $account->addMoney(1000); $anotherAccount->addMoney(500); $account->subtractMoney(50);
Ich vermute, dass der Saldo in den Konten von Luke und Leia in galaktischen Standardkrediten ausgedrückt wird, obwohl ich im Allgemeinen bezweifle, dass sie solche Operationen offen durchführen würden.
Meine Aufmerksamkeit wurde auch durch den folgenden Vorteil der Generierung von Ereignissen mit diesem Paket erregt, der in der Dokumentation angegeben ist:
Ein interessanter Punkt bei der Arbeit mit Projektoren - sie können nach Eintreten von Ereignissen erstellt werden. Stellen Sie sich vor, die Bank möchte einen Bericht über den durchschnittlichen Kontostand auf jedem Konto erhalten. In diesem Fall reicht es aus, einen neuen Projektor zu erstellen, alle Ereignisse abzuspielen und diese Daten am Ende abzurufen.
Die Idee, am Ende der Veranstaltungen neue Projektoren zu entwickeln, scheint sehr vielversprechend. Es stellt sich heraus, dass Sie nicht alle „richtigen“ Daten im Voraus abrufen müssen, sondern iterativ zum Ergebnis gelangen können.
In Bezug auf die Leistung erfolgt der Zugriff auf Projektoren laut Dokumentation "sehr schnell".
Möchten Sie mehr wissen?
Zu Beginn empfehle ich Ihnen, die Event Projector-Dokumentation zu lesen und sicherzustellen, dass Sie die neueste Version von PHP 7.2 installiert haben. Das Spatie-Team hat außerdem eine Beispielanwendung auf Laravel hochgeladen, die die Funktionen des Event Projector-Pakets demonstriert.
Sie können den Code herunterladen, das Repository mit einem Sternchen markieren und zur Entwicklung des Event Projector-Projekts auf GitHub beitragen. Zum Zeitpunkt des Schreibens hat das Projekt Event Projector bereits 15 Teilnehmer, deren Bemühungen die stabile Veröffentlichung von 1.0 ermöglichten. Großartige Arbeit, Spatie! Ich bin mir sicher, dass Event Projector ein weiteres großartiges Paket sein wird, das von der Laravel-Community geschätzt wird.