所以 Laravel 5 终于在昨天发布了命令总线的最终实现,但我在徘徊,使用命令总线与之前版本中的事件机制有什么真正的区别?
好的,我明白了它可用于从 Request 对象创建命令的原因,这非常有用,但除此之外,它的行为方式似乎与现在的事件的整个排队功能相似?
您能否提供用例示例以及两者的优缺点?
最佳答案
- 命令是即将发生的事情。即“创建用户”
- 事件是现在刚刚发生的事情 - 即“UserSuccessfullyCreated”
差异似乎很小 - 但有一些关键差异。
- 必须专门调用/调度命令。 IE。如果你想 执行 CommandX - 您必须在某处调用 CommandX。
- 事件响应在您的应用程序中触发任何地方的事件。 最棒的是多个事件处理类可以响应 相同的事件。
让我们举一个例子来最好地说明它。假设我们创建了一个用户,我们想向他们发送一封欢迎电子邮件并更新我们的时事通讯列表。
在命令场景中会这样做
AdminController {
function create() {
Bus::dispatch(new CreateUser(Auth::user());
}
}
然后在我们的 CommandClass 中 - 我们会这样做
public function handle(CreateUser $auth)
{
// 1. Create the user here
// 2. Send welcome email
// 3. Update our newsletter
}
但是如果我们使用事件——我们会在我们的 CommandClass 中做这样的事情
public function handle(CreateUser $auth)
{
// 1. Create the user here
Event::fire(new UserWasCreated($user));
}
然后我们可以创建尽可能多的事件来监听该事件并做一些事情:
事件类A
Event::listen('UserWasCreated', function($event)
{
// 2. Send welcome email
});
事件类B
Event::listen('UserWasCreated', function($event)
{
// 3. Update our newsletter
});
最重要的是关注点分离。命令“createuser”现在不需要担心在用户创建之后会发生什么。它只需要CreateUser。
另外 - 如果我们想在用户注册后添加另一个功能 - 比如说在乐透抽奖中输入它们 - 你可以添加另一个事件类并添加一个新的事件监听器。
事件类C
Event::listen('UserWasCreated', function($event)
{
// 4. Register them in lotto
});
注意我们如何不需要触摸命令 CreateUser 类代码?这在 OOP 风格的方法中提供了真正的类分离关注点。
关于php - Laravel 5 上下文中的命令和事件有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28344009/