2017-04-13 44 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

我想说的是,不要去那个地方开火。使用案例和行动后。它会给你很好的建筑。但要确保它不会无限循环。 –

相关问题