Php 什么';在Laravel 5的上下文中,命令和事件之间的区别是什么?
Laravel5终于在昨天发布了,最终实现了命令总线,但我想知道,在以前的版本中,使用命令总线而不是事件机制的真正区别是什么 好的,我明白了它可以用来从请求对象创建命令的原因,这非常有用,但除此之外,它的行为方式似乎与事件的整个排队功能类似 您能否提供用例的示例,以及它们的优缺点在哪里?Php 什么';在Laravel 5的上下文中,命令和事件之间的区别是什么?,php,laravel,laravel-5,Php,Laravel,Laravel 5,Laravel5终于在昨天发布了,最终实现了命令总线,但我想知道,在以前的版本中,使用命令总线而不是事件机制的真正区别是什么 好的,我明白了它可以用来从请求对象创建命令的原因,这非常有用,但除此之外,它的行为方式似乎与事件的整个排队功能类似 您能否提供用例的示例,以及它们的优缺点在哪里? 命令是即将发生的事情。i、 e.“CreateUser” 事件是指现在刚刚发生的事件,即“UserSuccessfullyCreated” 这些差异看起来很小,但也有一些关键的差异 必须专门调用/调度命令。
- 命令是即将发生的事情。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中的命令表示设计模式的实现 命令的主要优点:
- 可以从任何地方访问
- 它们很容易被任何其他开发人员阅读
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事件:生成
非常容易理解:)谢谢。完美的解释。