Accueil
NexoPOS

Événement de champs dispatchables du modèle

L’événement de champs dispatchables est un concept qui garantit le déclenchement d’événements lorsque la propriété d’un modèle change. Contrairement aux événements de modèle classiques, qui sont déclenchés lorsqu’une action spécifique est effectuée (enregistrer, mettre à jour, supprimer, etc.), ici nous avons une implémentation approfondie qui ne se déclenche que si un attribut précis d’un modèle a changé.

La raison de cette implémentation est d’éviter d’envoyer et d’écouter des événements lorsque ce n’est pas nécessaire. Par exemple, une commande sur NexoPOS peut être mise à jour de plusieurs façons. À chaque fois que la commande est mise à jour, nous avons des écouteurs par défaut prêts à exécuter une action spécifique. Ne serait-il pas préférable que, lorsque l’affectation du client change, nous calculions des rapports pour les clients précédent et récent ? Ne serait-il pas préférable de ne notifier le chauffeur que lorsque le statut de livraison passe de « en attente » à « prêt pour la livraison » ? C’est exactement l’objectif de cette fonctionnalité.

Mise en œuvre

L’implémentation de cette fonctionnalité consiste uniquement à fournir un tableau $dispatchableFieldsEvents sur le modèle sur lequel nous voulons déclencher l’événement. Sur ce modèle, nous fournirons des propriétés et les événements associés comme ceci :

<?php
namespace Modules\YourModule\Models;

use App\Models\NsModel;
use Modules\YourModule\Events\DeliveryChangedEvent;

class Order extends NsModel
{
    public $dispatchableFieldsEvents  = [
      'delivery_status' =>  DeliveryChangedEvent::class
    ];
}

Maintenant, nous devons définir l’événement, car il ne reçoit pas seulement le modèle en tant que paramètre, mais aussi l’ancienne et la nouvelle valeur de la propriété :

<?php
namespace Modules\YourModule\Events;

use App\Models\Order;

class DeliveryChangedEvent
{
    public function __construct( public Order $order, public mixed $previous, public mixed $new )
    {
        // ...
    }
}

À partir d’ici, vous pouvez écouter en toute sécurité cet événement depuis notre écouteur d’événements comme ceci :

<?php 
namespace Modules\YourModule\Listeners;

use Modules\YourModule\Events\DeliveryChangedEvent;
use Moduels\YourModules\Services\DriverService;

class DeliveryChangedEventListener
{
    public function __construct( public DriverService $driverService ){
    {
        // ...
    }
      
    public function handle( DeliveryChangedEvent $event )
    {
          if ( $event->previous === 'pending' && $event->new === 'ready-for-delivery' ) {
              $this->driverService->notifyAssignedDriver( $event->order );
          }
    }
}