简介
Laravel 事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。事件类通常存放在 app/Events 目录,监听器存放在 app/Listeners。如果你在应用中没有看到这些目录,不要担心,它们会在你使用 Artisan 命令生成事件和监听器的时候自动创建。
简单的说下自己的理解
事件是一个工具,使用之后可以将逻辑变得清晰,降低代码的耦合,使用场景例如游戏中的请求发货,发邮件等,下面是主要是根据laravel文档来讲述整个流程
1 注册事件/监听器
首先在lapp/Providers/EventServiceProvider.php文件中去声明调用事件时会被谁监听到,也就是建立事件与监听者的关系,原始文件如下
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\Event' => [
'App\Listeners\EventListener',
],
//举例 发邮件事件
'App\Events\sendMail' => [ //你的事件
'App\Listeners\SendMailEventListener', //监听器
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
}
2 生成事件/监听器类
执行命令生成event事件和监听器,不必担心事件重复执行命令会重复创建事件
php artisan event:generate
生成的事件在app\Events\SendMail.php目录下,监听器在app\Listeners\SendMailEventListener.php
SendMail.php
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class SendMail
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($email)
{
$this->email = $email; //实例化的时候传参
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
SendMailEventListener.php
<?php
namespace App\Listeners;
use App\Events\SendMail;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendMailEventListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param SendMail $event
* @return void
*/
public function handle(SendMail $event)
{
//具体方法逻辑的实现
$email = $event->email;
//如果你希望停止事件被传播到其他监听器,可以返回false实现
return false;
}
}
3 分发事件
以上我们事件的逻辑已经处理好了,接下来要做的就是触发事件,使用event辅助函数
<?php
namespace App\Http\Controllers;
use App\Order;
use App\Events\SendMail;
use App\Http\Controllers\Controller;
class OrderController extends Controller
{
/**
*
* @return Response
*/
public function ship($email)
{
// 发邮件逻辑
event(new SendMail($email));
}
}
总结
以上就是一个最简单的事件的创建和使用,如果想看完整的事件教程还是建议大家去看手册,事件的使用其实也挺适合多人开发的,如果一块逻辑包含很多个事件,多人维护的成本是比较大的,我们可以通过看事件以及监听器的逻辑就能理解一个需求,而不一定要去看Controller或者Service。