2017-04-13 11 views
0

これは実際にLaravelに必ずしも関連しない一般的な質問です。Laravel 5でイベントを起こすのに最適な場所は何ですか

私はコントローラとリポジトリの間に考えています。または、より良い場所があるかもしれませんか?長所と短所は何ですか?あなたの考えは?

ありがとうございます!

+0

あなたのコメントは何でもありません。より具体的にしてください。 – stakantin

答えて

1

コントローラとリポジトリの間でイベントを使用することはお勧めしません。これにより、あなたのリポジトリはあなたのアプリに密接に結合されます。

代わりにイベントをコントローラ内で発生させ、イベントハンドラでは、リポジトリやその他のビジネスロジックユニットに対処します。この方法では、あなたの(または任意の)リポジトリ内にイベントリスナー/ハンドラを宣言する必要はありません。

EDIT

イベントはステートレスプロセスとして使用されることを意味します。

ステートレスが、前の相互作用のレコードがありませんし、各対話要求は完全にそれが付属していた情報に基づいて処理する必要があること - source

だから、ベストプラクティスは、あなたが内部のあなたのイベントを発生ということですエンドポイントからのコールバックを期待していない場合に限ります(コントローラー側で目的のリポジトリーと対話する場合)。あなたがイベント火災(あなたが1つの多くまたはnoneまたはリポジトリに対処)自分のコントローラ内のユーザ登録を処理した後

をUserRegistered。あなたのハンドラの内部では、ユーザオブジェクトを受け取り、その中に情報を入れて、ウェルカムメッセージで電子メールを送信します。ここでも、ハンドラの中には、1つまたは複数のライブラリを使用することができます。別のイベントを起動することもできますが、そのイベントが開始されたポイントには情報を戻すことはできません。

ここで、いくつかのライブラリには、接続して情報を聞くことができる内部の「バス」があります。それらをドメインイベントに使用して、独自のリスナーを作成することができます。他の開発者のためにフックを持たせたい場合は、自分のライブラリ内でこのシナリオを複製することもできます。

+0

それは理にかなっています。しかし、私は他の可能性を見ない場合もあります。例えば、コントローラからは、私はレポのメソッドを呼び出します。このメソッドは、モデルのコレクションを反復処理し、ある条件によってモデルの状態を変更し、イベントModelUpdatedEventを発生させます。それはアーキテクチャが間違っていることを意味しますか?あるいは、あなたはそのような状況をどうしますか? – stakantin

+0

私はあなたを正しく理解していますか?あなたの意見は、コントローラでイベントを発生させることですか? – stakantin

+0

@stakantin私は解明のために私の答えを編集しました – VikingCode

0

これは完全にあなたのユースケースによって異なります。コントローラまたはモデル/リポジトリからイベントを発生させることができます。

あなたの質問に基づいて、私は2つのシナリオについて説明します。あなたのイベントは、ユーザーのアクションに関連している場合

:ユーザーアクションに基づいて

  1. イベントを。あなたはコントローラからそれを発射することができます。

    例:

    は、あなたが物流管理プロジェクトを構築しているとしましょう。ご注文後にOrderShippedイベントを発射することができます。あなたのコードのアクションに基づいて

    namespace App\Http\Controllers; 
    
    use App\Order; 
    use App\Events\OrderShipped; 
    use App\Http\Controllers\Controller; 
    
    class OrderController extends Controller 
    { 
        /** 
        * Ship the given order. 
        * 
        * @param int $orderId 
        * @return Response 
        */ 
        public function ship($orderId) 
        { 
         $order = Order::findOrFail($orderId); 
    
         // Order shipment logic... 
    
         event(new OrderShipped($order)); 
        } 
    } 
    
  2. イベント:

    あなたのコード内のアクションを持っている場合。そこからイベントを起こすことができます。

    例:

    Laravel自体が彼らのモデルでは、更新、保存するためのイベントを発生。コードイベントhereを見てください。

編集:

だからイベントを発生する場所を見ていません。イベントを発生させるアクション、ユースケース、およびシナリオを探します。通常、イベントはコードの再利用性を高めます。

+0

私はどこからでもイベントを起こすことができます。私は正当な理由、賛否両論、特定の場所を探しています。 – stakantin

+0

私が言おうとしているのは、それを発射する場所に行ってはいけないということです。ユースケースとアクションの後に移動します。それはあなたによい建築を与えるでしょう。しかし、無限ループにならないようにしてください。 –

関連する問題