在Laravel 5举办活动的最佳场所是什么?

时间:2017-04-13 08:31:22

标签: laravel-5

这实际上是一个与Laravel无关的一般性问题。

我在控制器和存储库之间进行思考。或者也许有一个更好的地方?什么是利弊?你有什么想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

我不建议在控制器和存储库之间使用事件。这使您的存储库与您的应用程序紧密耦合。

相反,只需在您的控制器和事件处理程序中激活您的事件,您就可以访问存储库和其他业务逻辑单元。这样您就不必在您的(或任何)存储库中声明任何事件侦听器/处理程序。

修改

事件旨在用作无状态流程。

  

无状态意味着没有先前互动的记录,每个互动请求必须完全基于随附的信息进行处理 - source

因此,最好的做法是在控制器内部启动事件,但前提是您不希望从端点发出任何回调。(如果是这样,您将与控制器侧的所需存储库进行交互)。 / p>

示例在您的控制器中处理用户注册(您在其中寻址一个或多个存储库或没有存储库)后,您将触发事件 UserRegistered 。现在在您的处理程序中,您将收到用户对象,并且通过其中的信息,您可以发送包含欢迎消息的电子邮件。同样,您可以在处理程序中使用none,one或many库。您甚至可以触发另一个事件,但是您无法将任何信息传递回发起事件的位置。

现在有些图书馆有内部的巴士和#39;你可以在哪里联系并听取信息。您可以将这些用于域事件并创建自己的侦听器。如果你想为其他开发人员(你的自己在lib之外)拥有钩子,你也可以在你自己的库中复制这个场景。

答案 1 :(得分: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

  3. 修改:

    所以不要寻找一个发射事件的地方。寻找行动,用例和场景来发起事件。通常,事件会增加代码的可重用性。