Modellereignis für dispatchbare Felder
Das Ereignis „dispatchable fields“ ist ein Konzept, das sicherstellt, dass Ereignisse ausgelöst werden, wenn sich eine Model-Eigenschaft ändert. Im Gegensatz zu regulären Model-Ereignissen, die ausgelöst werden, wenn eine bestimmte Aktion ausgeführt wird (Speichern, Aktualisieren, Löschen usw.), handelt es sich hier um eine tiefgreifende Implementierung, die nur dann ausgelöst wird, wenn sich ein bestimmtes Attribut eines Models geändert hat.
Der Grund für diese Implementierung war, das Versenden und Abhören von Events zu vermeiden, wenn es nicht notwendig ist. Beispielsweise kann eine Bestellung in NexoPOS auf verschiedene Arten aktualisiert werden. Jedes Mal, wenn die Bestellung aktualisiert wird, gibt es standardmäßige Listener, die bereit sind, eine bestimmte Aktion auszuführen. Wäre es nicht besser, wenn wir bei einer Änderung des zugewiesenen Kunden Berichte für den vorherigen und den aktuellen Kunden berechnen würden? Wäre es nicht besser, wenn wir den Fahrer nur dann benachrichtigen könnten, wenn sich der Lieferstatus von „ausstehend“ zu „bereit zur Lieferung“ ändert? Genau darum geht es bei dieser Funktion.
Implementierung
Die Implementierung dieser Funktion besteht lediglich darin, ein Array $dispatchableFieldsEvents auf dem Modell bereitzustellen, an das das Ereignis gesendet werden soll. Auf diesem Modell stellen wir dann Eigenschaften und zugehörige Events wie folgt bereit:
<?php
namespace Modules\YourModule\Models;
use App\Models\NsModel;
use Modules\YourModule\Events\DeliveryChangedEvent;
class Order extends NsModel
{
public $dispatchableFieldsEvents = [
'delivery_status' => DeliveryChangedEvent::class
];
}
Jetzt müssen wir das Ereignis definieren, da es nicht nur das Modell als Parameter erhält, sondern auch den vorherigen und den neuen Wert der Eigenschaft:
<?php
namespace Modules\YourModule\Events;
use App\Models\Order;
class DeliveryChangedEvent
{
public function __construct( public Order $order, public mixed $previous, public mixed $new )
{
// ...
}
}
Von hier aus können Sie dieses Ereignis sicher über unseren Event-Listener so abhören:
<?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 );
}
}
}