2017-04-13 47 views

回答

1

我不推薦在控制器和存儲庫之間使用事件。這使您的存儲庫與您的應用程序緊密耦合。

取而代之的是在控制器內部以及事件處理程序中觸發您的事件,以處理存儲庫和其他業務邏輯單元。這樣你就不必在你的(或任何)存儲庫中聲明任何事件監聽器/處理器。

EDIT

活動旨在被用作無狀態的過程。

無國籍意味着沒有以前的交互的記錄,每一交互請求已被處理完全基於其附帶的信息 - source

所以最好的做法是,你內火的事件您的控制器,但前提是您不希望從端點接收任何回調(如果是這樣的話,您可以在控制器中與所需的存儲庫進行交互)。

處理您的控制器內的用戶註冊後(在那裏你解決一個或多個或無庫),你火事件UserRegistered。現在在您的處理程序中,您會收到用戶對象,並使用裏面的信息發送帶有歡迎消息的電子郵件。再次,您可以在處理程序中使用無,一個或多個庫。您甚至可以發起另一個事件,但是無法將任何信息傳遞迴事件發起點。

現在一些圖書館有內部'巴士',您可以在此連接並收聽信息。您可以將這些用於域事件並創建您自己的偵聽器。你也可以在你自己的庫中複製這個場景,如果你想爲其他開發者(你自己的lib之外的)設置鉤子的話。

+0

這很有道理。但在某些情況下,我看不到其他可能性。例如,從控制器我調用一個回購的方法。該方法遍歷模型集合,並通過某些條件更改模型的狀態並觸發事件ModelUpdatedEvent。這是否意味着架構錯了?或者你會怎麼做這種情況? – stakantin

+0

我理解正確嗎?你的意見是僅在控制器中觸發事件? – stakantin

+0

@stakantin我編輯了我的答案澄清 – VikingCode

0

它完全取決於你的用例。您可以從控制器或模型/存儲庫中觸發事件。

根據你的問題,我描述了兩個方案:

  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

我想說的是,不要去那個地方開火。使用案例和行動後。它會給你很好的建築。但要確保它不會無限循環。 –

相關問題