php - Laravel 5 上下文中的命令和事件有什么区别?

标签 php laravel laravel-5

所以 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/

相关文章:

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

php - 插入查询未插入数据库

laravel - 所需的验证在 laravel darkaonline swagger UI 中不起作用

javascript - Laravel API,一次POST请求中传递多个对象的正确方式

angularjs - 使用 JWT 进行 Laravel 身份验证时出现 Satellizer 警告 "Expecting a token named token"

php - PHP中姓氏的正确大写

laravel - 将Laravel Homestead v7.0.1与php 7.2更改为php 7.1

mysql - 更新对象时重复键输入

javascript - Braeintree 客户端使用 JS v3 设置 - payment_method_nonce null 并且表单未提交

javascript - 根据 Laravel 中的状态显示人员目录