这实际上是一个与Laravel无关的一般性问题。
我在控制器和存储库之间进行思考。或者也许有一个更好的地方?什么是利弊?你有什么想法?
谢谢!
答案 0 :(得分:1)
我不建议在控制器和存储库之间使用事件。这使您的存储库与您的应用程序紧密耦合。
相反,只需在您的控制器和事件处理程序中激活您的事件,您就可以访问存储库和其他业务逻辑单元。这样您就不必在您的(或任何)存储库中声明任何事件侦听器/处理程序。
修改强>
事件旨在用作无状态流程。
无状态意味着没有先前互动的记录,每个互动请求必须完全基于随附的信息进行处理 - source
因此,最好的做法是在控制器内部启动事件,但前提是您不希望从端点发出任何回调。(如果是这样,您将与控制器侧的所需存储库进行交互)。 / p>
示例在您的控制器中处理用户注册(您在其中寻址一个或多个存储库或没有存储库)后,您将触发事件 UserRegistered 。现在在您的处理程序中,您将收到用户对象,并且通过其中的信息,您可以发送包含欢迎消息的电子邮件。同样,您可以在处理程序中使用none,one或many库。您甚至可以触发另一个事件,但是您无法将任何信息传递回发起事件的位置。
现在有些图书馆有内部的巴士和#39;你可以在哪里联系并听取信息。您可以将这些用于域事件并创建自己的侦听器。如果你想为其他开发人员(你的自己在lib之外)拥有钩子,你也可以在你自己的库中复制这个场景。
答案 1 :(得分:0)
这完全取决于您的使用案例。您可以从控制器或模型/存储库中触发事件。
根据您的问题,我描述了两种情况:
基于用户操作的事件:
如果您的活动与用户操作有关。你可以从你的控制器发射它。
示例:强>
让我们假设您正在建立一个物流管理项目。您可以在发货后发起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。
修改:
所以不要寻找一个发射事件的地方。寻找行动,用例和场景来发起事件。通常,事件会增加代码的可重用性。