Php 什么';在Laravel 5的上下文中,命令和事件之间的区别是什么?

Php 什么';在Laravel 5的上下文中,命令和事件之间的区别是什么?,php,laravel,laravel-5,Php,Laravel,Laravel 5,Laravel5终于在昨天发布了,最终实现了命令总线,但我想知道,在以前的版本中,使用命令总线而不是事件机制的真正区别是什么 好的,我明白了它可以用来从请求对象创建命令的原因,这非常有用,但除此之外,它的行为方式似乎与事件的整个排队功能类似 您能否提供用例的示例,以及它们的优缺点在哪里? 命令是即将发生的事情。i、 e.“CreateUser” 事件是指现在刚刚发生的事件,即“UserSuccessfullyCreated” 这些差异看起来很小,但也有一些关键的差异 必须专门调用/调度命令。

Laravel5终于在昨天发布了,最终实现了命令总线,但我想知道,在以前的版本中,使用命令总线而不是事件机制的真正区别是什么

好的,我明白了它可以用来从请求对象创建命令的原因,这非常有用,但除此之外,它的行为方式似乎与事件的整个排队功能类似

您能否提供用例的示例,以及它们的优缺点在哪里?

  • 命令是即将发生的事情。i、 e.“CreateUser”
  • 事件是指现在刚刚发生的事件,即“UserSuccessfullyCreated”
这些差异看起来很小,但也有一些关键的差异

  • 必须专门调用/调度命令。也就是说,如果你想 do CommandX-您必须在某处调用CommandX
  • 事件响应应用程序中任意位置触发的事件。 最棒的是,多个事件处理类可以响应 同样的事件
让我们做一个例子来最好地说明它。假设我们创建了一个用户,我们希望向他们发送一封欢迎电子邮件,并更新我们的通讯列表

在命令场景中,可以这样做

AdminController {

    function create() {
            Bus::dispatch(new CreateUser(Auth::user());
    }
}
然后在我们的命令课上,我们会

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));
    }
然后,我们可以创建尽可能多的事件来收听该事件并做一些事情:

EventClassA

Event::listen('UserWasCreated', function($event)
{
    // 2. Send welcome email
});
事件类别B

Event::listen('UserWasCreated', function($event)
{
    // 3. Update our newsletter
});
最大的好处是分离关注点。“createuser”命令现在不需要担心创建用户后会发生什么。它只需要创建一个用户

另外,如果我们想在用户注册后添加另一个函数,比如说在乐透抽奖中输入它们,那么您可以添加另一个事件类并添加一个新的事件侦听器

事件类别C

Event::listen('UserWasCreated', function($event)
{
    // 4. Register them in lotto
});

注意,我们根本不需要接触命令CreateUser类代码?这在OOP风格的方法中提供了真正的类分离关注点。

我只想在正确答案的基础上分享我对这个概念的理解:

主要区别在于命令可以更改模型状态,而事件只对状态更改作出反应

命令:

Laravel中的命令表示设计模式的实现

命令的主要优点:

  • 可以从任何地方访问
  • 它们很容易被任何其他开发人员阅读
要在Laravel 5中创建命令,请执行以下操作:

您需要生成命令DTO(它可以实现自处理接口)。使用php artisan make:command{command name}

示例:
php artisan make:command课程/PostCourseCommand

命令的命名约定:使用业务语言并向其添加后缀命令

要从控制器调用(调度)命令,可以使用:

$this->dispatch(新建PostCourseCommand())

Bus::dispatch(新的PostCourseCommand())

旁注: “从请求发送”功能是一种很好的方法,可以跳过将变量逐个传递给命令构造函数,相反,它将为您解决这一问题:

例如:

$test_request = Request::create('/test', 'GET', [
   'name' => 'Mahmoud',
   'nickname' => 'Mega'
]);

$result = Bus::dispatchFrom(
   CreateCourse::class, $test_request
);
protected $listen = [    
   \Zzz\Events\LogSomething::class => [ // event.name
      \Zzz\Handlers\Events\LogSomething::class, //EventListener
   ],
],    
最后:

您可以将处理程序函数及其逻辑从命令DTO分离到处理程序目录,以便:

  • 通过artisan生成命令处理程序
  • art handler:command--command=“Course/PoatCourseCommand”

  • 从命令类中删除SelfHandling接口,以便它将搜索处理程序来处理它

  • 事件:

    Laravel中的事件表示设计模式的实现

    要在Laravel 5中创建事件,请执行以下操作:

  • 使用artisan:
    艺术制作:事件{event name}
  • 示例:
    art make:event LogSomething

  • 为该事件生成事件处理程序
  • art处理程序:事件LogSomething--event=“LogSomething”

  • 在事件服务提供程序
    (app/Providers/EventServiceProvider.php)
  • 例如:

    $test_request = Request::create('/test', 'GET', [
       'name' => 'Mahmoud',
       'nickname' => 'Mega'
    ]);
    
    $result = Bus::dispatchFrom(
       CreateCourse::class, $test_request
    );
    
    protected $listen = [    
       \Zzz\Events\LogSomething::class => [ // event.name
          \Zzz\Handlers\Events\LogSomething::class, //EventListener
       ],
    ],    
    
    调用(激发)事件:

    使用:

    Event::fire(新的LogSomething());

    也可以使用事件帮助器

    事件(新的LogSomething());

    旁注: 或者,只需在服务提供程序中注册事件,然后运行此命令,即可生成事件


    php artisan事件:生成
    非常容易理解:)谢谢。完美的解释。