2016-02-08 10 views
6

私はと呼ばれるジョブコマンドを開発するintnedそこからUserWasRegisteredと呼ばれるリスナー持っまたUserWasRegisteredとイベントを呼び出しています命名Laravelイベント、リスナーとジョブズ

EmailRegistrationConfirmation

NotifyAdminsNewRegistration

CreateNewBillingAccount

これらのすべてのジョブは、イベントリスナークラスUserWasRegistered内で実行されます。

これは正しい方法ですか、それともUserWasRegisteredの複数のリスナーを用意するだけですか?私は、私のアプリケーションで他の分野からの「仕事」を別々の時間に呼び出すことができるように、仕事のアプローチを使用していると感じています。例えばユーザーが詳細を変更した場合はCreateNewBillingAccountを呼び出すことがあります...?

+0

リスターが基本的にジョブを呼び出してはいけません。タスク自体を実行する責任はありませんか? – AndrewMcLagan

答えて

1

何が起こっているかをより明示的に示すリスナー名を変更することを推奨します。そのため、リスナーとイベントを直接ペアリングしないようにします。

リスナーは実際のタスクを"doers"(ジョブ、サービス、名前)に渡すため、貧弱なイベント/リスナーのアプローチを使用しています。

この例は、実際のシステムから取得されます:

アプリ/プロバイダ/ EventServiceProvider.php

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

StartSubscriptionリスナー:

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

することができます。この方法othでジョブ/サービスを呼び出す(この例ではSubscriptionCreator)あなたのアプリケーションのすべての領域。

リスナーをOrderWasPaid以外の他のイベントにバインドすることもできます。