Projecteur d'événements Laravel et concept de génération d'événements


La traduction de l'article a été préparée pour les étudiants du cours professionnel "Framework Laravel"




Frek Van der Herten et l'équipe Spatie ont longtemps travaillé dur sur le Laravel Event Projector, un package qui vous permet d'appliquer le concept Event Sourcing au framework Laravel. Et enfin, la première version stable (v1.0.0) est disponible!


Vous pouvez installer Event Projector dans votre projet à l'aide de composer et, grâce à la détection automatique des packages dans Laravel, vous mettre au travail immédiatement après la publication des migrations et de la configuration des packages!


composer require spatie/laravel-event-projector:^1.0.0 

Event Projector nécessite PHP 7.2, donc votre application doit prendre en charge la dernière version de PHP, bien que le framework Laravel lui-même ait besoin d'une version PHP d'au moins 7.1.3.


Qu'est-ce que la «génération d'événements»


Dans l'article Génération d'événements, ce concept est décrit comme suit:


Au lieu de stocker l'état actuel des données dans le domaine, utilisez le référentiel à ajouter uniquement pour ajouter des données afin d'enregistrer la séquence complète des actions effectuées sur ces données. Le stockage agit comme un système d'enregistrements et peut être utilisé pour matérialiser des objets de domaine. Cela nous permet de simplifier les tâches dans des domaines complexes, car il n'est pas nécessaire de synchroniser le modèle de données et le domaine, ce qui conduit à une évolutivité améliorée, une productivité accrue et une efficacité opérationnelle. Cette approche garantit la cohérence des données transactionnelles, et vous permet également de conserver un journal et un historique complet des modifications, permettant de réaliser des actions compensatoires.

Je vous recommande de lire l'intégralité de l'article. Il fournit une excellente description de ce modèle, exprime des considérations pour une bonne utilisation et décrit les situations où il peut être utile.


J'aime aussi l'explication du concept de génération d'événements, qui est donnée dans l'introduction de la documentation pour Event Projector:


La génération d'événements est la même en ce qui concerne les données que Git en ce qui concerne le code. La plupart des applications stockent uniquement leur état actuel dans la base de données. Une quantité importante d'informations utiles est perdue - vous ne savez pas comment l'application a atteint cet état.

Le concept de génération d'événements est une tentative de résoudre ce problème en enregistrant tous les événements qui se produisent dans votre application. L'état de l'application est formé à la suite de l'écoute de ces événements.

Pour faciliter la compréhension, considérez un petit exemple tiré de la vie. Imaginez que vous êtes une banque. Vos clients ont des comptes. Garder uniquement des informations sur le solde du compte ne suffit pas. Vous devez également vous souvenir de toutes les transactions. Lorsque vous utilisez le modèle de génération d'événements, le solde du compte ne sera pas simplement un champ séparé dans la base de données, mais une valeur calculée en fonction des informations de transaction stockées. Ce n'est là qu'un des nombreux avantages qu'offre le concept de génération d'événements.

Ce package est conçu pour familiariser les utilisateurs du framework Laravel avec le concept de génération d'événements et faciliter son utilisation dans la pratique.

Il semble que Event Projector contribue à simplifier le travail avec le modèle de génération d'événements. La documentation m'a également aidé à comprendre comment utiliser cette approche dans le cadre des concepts du framework Laravel que je connais déjà.


Laravel Eventing Basics


Pour comprendre le fonctionnement de la génération d'événements dans le package Event Projector et les composants impliqués dans ce processus, vous devez lire la section Création du premier projecteur .


À un niveau élevé (pardonnez-moi si je ne suis pas tout à fait correct dans mon évaluation, car la génération d'événements est un nouveau concept pour moi) la génération d'événements à l'aide du projecteur d'événements comprend:


  • Modèles éloquents
  • Événements mettant en œuvre l'interface ShouldBeStored
  • Classes de projecteur

Un exemple de classe de modèle avec la méthode statique createWithAttributes , fourni dans la documentation:


 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 { /* *      (uuid). */ $attributes['uuid'] = (string) Uuid::uuid4(); /* *          uuid. */ event(new AccountCreated($attributes)); /* *         uuid. */ 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)); } /* *         uuid. */ public static function uuid(string $uuid): ?Account { return static::where('uuid', $uuid)->first(); } } 

Ici, vous devez faire attention aux événements MoneyAdded , MoneyAdded , MoneySubtracted et AccountDeleted , déclenchés respectivement pour ouvrir un compte, ajouter de l'argent au compte, retirer de l'argent du compte et supprimer le compte.


Voici un exemple de l'événement MoneyAdded (ajout d'argent à un compte). L'interface ShouldBeStored indique au package Event Projector que cet événement doit être enregistré:


 namespace App\Events; use Spatie\EventProjector\ShouldBeStored; class MoneyAdded implements ShouldBeStored { /** @var string */ public $accountUuid; /** @var int */ public $amount; public function __construct(string $accountUuid, int $amount) { $this->accountUuid = $accountUuid; $this->amount = $amount; } } 

Et enfin, un exemple partiel d'un gestionnaire d'événements à l'intérieur de la classe des projecteurs pour reconstituer les fonds du compte (mon type d'événement bancaire préféré):


 public function onMoneyAdded(MoneyAdded $event) { $account = Account::uuid($event->accountUuid); $account->balance += $event->amount; $account->save(); } 

Pour lier tout cela ensemble, considérez un exemple de la documentation sur la création d'un nouveau compte et l'ajout de fonds:


 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); 

Je soupçonne que le solde des comptes de Luke et Leia est exprimé en prêts standard galactiques, bien qu'en général je doute qu'ils mèneraient ouvertement de telles opérations.


Mon attention a également été attirée par l'avantage suivant de générer des événements à l'aide de ce package, comme indiqué dans la documentation:


Un point intéressant lorsque vous travaillez avec des projecteurs - ils peuvent être créés après que des événements se soient produits. Imaginez que la banque souhaite recevoir un rapport sur le solde moyen de chaque compte. Dans ce cas, il suffira de créer un nouveau projecteur, de lire tous les événements et d'obtenir ces données au final.

L'idée même de créer de nouveaux projecteurs à la fin des événements semble très prometteuse. Il s'avère que vous n'avez pas besoin d'obtenir toutes les «bonnes» données à l'avance, mais vous pouvez arriver au résultat de manière itérative.


Quant aux performances, selon la documentation, l'accès aux projecteurs "se fait très rapidement".


Envie d'en savoir plus?


Pour commencer, je vous recommande de lire la documentation du projecteur d'événements et de vous assurer que la dernière version de PHP 7.2 est installée. L'équipe Spatie a également téléchargé un exemple d'application sur Laravel , démontrant les capacités du package Event Projector.


Vous pouvez télécharger le code, marquer le référentiel avec un astérisque et également contribuer au développement du projet Event Projector sur GitHub . Au moment de la rédaction, le projet Event Projector comptait déjà 15 participants, dont les efforts ont rendu possible la sortie stable de 1.0. Excellent travail, Spatie! Je suis sûr que Event Projector sera un autre excellent package qui sera apprécié par la communauté Laravel.

Source: https://habr.com/ru/post/fr460683/


All Articles