回答
我不推荐在控制器和存储库之间使用事件。这使您的存储库与您的应用程序紧密耦合。
取而代之的是在控制器内部以及事件处理程序中触发您的事件,以处理存储库和其他业务逻辑单元。这样你就不必在你的(或任何)存储库中声明任何事件监听器/处理器。
EDIT
活动旨在被用作无状态的过程。
无国籍意味着没有以前的交互的记录,每一交互请求已被处理完全基于其附带的信息 - source
所以最好的做法是,你内火的事件您的控制器,但前提是您不希望从端点接收任何回调(如果是这样的话,您可以在控制器中与所需的存储库进行交互)。
例处理您的控制器内的用户注册后(在那里你解决一个或多个或无库),你火事件UserRegistered。现在在您的处理程序中,您会收到用户对象,并使用里面的信息发送带有欢迎消息的电子邮件。再次,您可以在处理程序中使用无,一个或多个库。您甚至可以发起另一个事件,但是无法将任何信息传递回事件发起点。
现在一些图书馆有内部'巴士',您可以在此连接并收听信息。您可以将这些用于域事件并创建您自己的侦听器。你也可以在你自己的库中复制这个场景,如果你想为其他开发者(你自己的lib之外的)设置钩子的话。
这很有道理。但在某些情况下,我看不到其他可能性。例如,从控制器我调用一个回购的方法。该方法遍历模型集合,并通过某些条件更改模型的状态并触发事件ModelUpdatedEvent。这是否意味着架构错了?或者你会怎么做这种情况? – stakantin
我理解正确吗?你的意见是仅在控制器中触发事件? – stakantin
@stakantin我编辑了我的答案澄清 – VikingCode
它完全取决于你的用例。您可以从控制器或模型/存储库中触发事件。
根据你的问题,我描述了两个方案:
事件根据用户操作:
如果事件与用户操作。你可以从你的控制器中启动它。
例子:
比方说,你正在构建一个物流管理项目。订单发货后,您可以触发
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)); } }
事件基于代码中的操作:
如果你在你的代码的动作。你可以从那里开始活动。
例子:
Laravel自身火节省事件,在其换代车型。看看代码事件here。
编辑:
所以,不要只是在寻找一个触发事件的地方。寻找行动,用例和场景来触发事件。通常事件会增加代码的可重用性。
我知道我可以从任何地方开火。我正在寻找很好的理由,对于某个特定地方的优点和缺点。 – stakantin
我想说的是,不要去那个地方开火。使用案例和行动后。它会给你很好的建筑。但要确保它不会无限循环。 –
- 1. 在MVC中触发事件的最佳地点是什么?
- 2. 在laravel 5中写入代码的最佳做法是什么?*
- 3. 什么是生成站点地图的最佳方式
- 4. 什么是生成站点地图的最佳方式?
- 5. 什么是在UITableViewCell中添加AVPlayer或MPMoviePlayerController的最佳地点?
- 6. 在PHP Laravel 5中配置路由限制的最佳方式是什么?
- 7. 在laravel 5中配置测试环境的最佳方式是什么?
- 8. 什么是在Laravel 5中存储用户角色权限的最佳方式?
- 9. 的最佳方式 - Laravel 5
- 10. 在JavaScript中添加事件的最佳方式是什么?
- 11. 在TestCafe中等待'WebComponentsReady'事件的最佳方式是什么?
- 12. 在Ember.js中处理事件的最佳方式是什么?
- 13. 在ASP.NET中订阅事件的最佳方式是什么?
- 14. 什么是报告ASP.NET MVC中的错误的最佳地点?
- 15. 什么是寻找软件开发会议列表的最佳地点?
- 16. 在JavaScript中切换点击事件的最佳方式是什么?
- 17. 在C#中生成KML文件的最佳方式是什么?
- 18. 创新Laravel 5中的“设置”模型的最佳实践是什么?
- 19. 在Google地图上绘制点的最佳方式是什么?
- 20. 在Java中开发游戏的最佳软件包是什么?
- 21. 在laravel中执行此查询的最佳方式是什么?
- 22. 在Laravel中过滤收集的最佳方式是什么?
- 23. 在Laravel 5.1中显示菜单的最佳方式是什么?
- 24. 在Laravel 5.4中创建表单的最佳方式是什么?
- 25. 在Laravel中处理本地化消息的最佳做法是什么?
- 26. 为什么我的事件侦听器不在laravel 5中触发?
- 27. 跟踪Google Analytics中的点击事件的最佳方式是什么?
- 28. Laravel 5环境总是'生产'当它是事实'当地'
- 29. 在div上处理onchange事件的最佳方法是什么?
- 30. 单元测试Nodejs中发出的事件的最佳方式是什么?
您的评论与此无关。请更具体一些。 – stakantin