2016-02-08 9 views
6

Ich habe ein Ereignis UserWasRegistered auch genannt habe ich ein Zuhörer UserWasRegistered von dort genannt intned I Auftragsbefehle aufgerufen zu entwickeln:Benennung Laravel Ereignisse, Zuhörer und Jobs

EmailRegistrationConfirmation

NotifyAdminsNewRegistration

CreateNewBillingAccount

Alle diese Jobs würden innerhalb der Ereignis-Listener-Klasse UserWasRegistered ausgeführt werden.

Ist dies der richtige Ansatz oder sollte ich einfach mehrere Listener für UserWasRegistered haben? Ich habe das Gefühl, dass ich mit dem Job-Ansatz diese "Jobs" aus anderen Bereichen meiner Anwendung zu unterschiedlichen Zeiten aufrufen konnte. z.B. Aufruf CreateNewBillingAccount könnte aufgerufen werden, wenn ein Benutzer ihre Daten geändert hat ...?

+0

Grundsätzlich sollte ein Lister keine Jobs aufrufen. Sie haben nicht die Verantwortung, Aufgaben selbst auszuführen? – AndrewMcLagan

Antwort

1

Ich empfehle, die Listener-Namen zu ändern, die expliziter sind, was passiert, so würde ich vermeiden, Hörer direkt mit Ereignissen zu paaren.

Wir verwenden einen anämischen Event/Listener Ansatz, so dass Hörer die eigentliche Aufgabe an "Macher" (Jobs, Dienstleistungen, Sie nennen es) übergeben.

app/Anbieter/EventServiceProvider.php:

OrderWasPaid::class => [ 
     ProvideAccessToProduct::class, 
     StartSubscription::class, 
     SendOrderPaidNotification::class, 
     ProcessPendingShipment::class, 
     LogOrderPayment::class 
    ], 

StartSubscription Zuhörer:

Dieses Beispiel aus einem realen System genommen

namespace App\Modules\Subscription\Listeners; 


use App\Modules\Order\Contracts\OrderEventInterface; 
use App\Modules\Subscription\Services\SubscriptionCreator; 

class StartSubscription 
{ 
    /** 
    * @var SubscriptionCreator 
    */ 
    private $subscriptionCreator; 

    /** 
    * StartSubscription constructor. 
    * 
    * @param SubscriptionCreator $subscriptionCreator 
    */ 
    public function __construct(SubscriptionCreator $subscriptionCreator) 
    { 
     $this->subscriptionCreator = $subscriptionCreator; 
    } 

    /** 
    * Creates the subscription if the order is a subscription order. 
    * 
    * @param OrderEventInterface $event 
    */ 
    public function handle(OrderEventInterface $event) 
    { 
     $order = $event->getOrder(); 

     if (!$order->isSubscription()) { 
      return; 
     } 

     $this->subscriptionCreator->createFromOrder($order); 
    } 
} 

Auf diese Weise können Sie Rufen Sie in diesem Fall jobs/services auf (SubscriptionCreator in diesem Beispiel) Bereiche Ihrer Anwendung.

Es ist auch möglich, den Listener an andere Ereignisse zu binden, mit Ausnahme von OrderWasPaid.