一.事件
事件无处不在,比如用户登录、购买商品、搜索、查看文章,等等,都是事件,有了事件,就有事件监听器,事件监听器监听到事件发生后会执行一些操作,Laravel使用观察者模式来实现这种监听机制。本节我们通过一个简单的示例来讲述在Laravel中如何创建事件类、事件对应的监听器类,以及监听器如何监听事件发生并执行相应操作。
这里我们实现一个添加任务后后写入日志的事件
二.注册事件-监听器
1.我们需要在EventServiceProvider中注册事件与监听器之间的映射关系:
protected $listen = [
'App\Events\TaskAdded'=>[
'App\Listeners\SaveTaskToLogListener'
]
];
2.生成事件
php artisan event:generate
该命令会在app/Events目录下生成TaskAdded.php,在app/Listeners目录下生成SaveTaskToLogListener.php。
三.定义事件类TaskAdded.class
<?php
namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\Models\Task;
class TaskAdded extends Event
{
use SerializesModels;
public $task;
/**
* TaskAdded constructor.
* 构造函数,注入一个Task实例
* @param Task $task
*/
public function __construct(Task $task)
{
$this->task = $task;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
事件类什么都没做,只是注入了一个Task实例
四.事件监听器类SaveTaskToLogListener.php
<?php
namespace App\Listeners;
use Illuminate\Support\Facades\Log;
use App\Events\TaskAdded;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SaveTaskToLogListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param TaskAdded $event
* @return void
*/
public function handle(TaskAdded $event)
{
$task = $event->task;
Log::alert('添加了一个任务', ['id' => $task->id, 'name' => $task->name]);
}
}
五.触发事件
$task = Task::create(['user_id'=>Auth::id(), 'name' => $request->input('name')]);
// 触发事件
Event::fire(new TaskAdded($task));
六.事件订阅者
事件订阅者是指那些在类本身中订阅到多个事件的类,从而允许你在单个类中定义一些事件处理器。订阅者应该定义一个subscribe 方法,该方法中传入一个事件分发器实例;简言之就是一个监听器监类依靠不同的方法监听了多个事件类
1.监听器类代码(subscribe中设置了监听)
class TaskToLogListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
public function onAddTask(TaskAdded $event)
{
$task = $event->task;
Log::info('增加了task', ['id' => $task->id, 'name' => $task->name]);
}
public function onDelTask(TaskDeled $event)
{
$task = $event->task;
Log::info('删除了task', ['id' => $task->id, 'name' => $task->name]);
}
public function subscribe($events)
{
$events->listen('App\Events\TaskAdded','App\Listeners\TaskToLogListener@onAddTask');
$events->listen('App\Events\TaskDeled','App\Listeners\TaskToLogListener@onDelTask');
}
}
2.事件类
TaskAdded.class:
class TaskAdded extends Event
{
use SerializesModels;
public $task;
/**
* TaskAdded constructor.
* 构造函数,注入一个Task实例
* @param Task $task
*/
public function __construct(Task $task)
{
$this->task = $task;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
TaskDeled.class:
class TaskDeled extends Event
{
use SerializesModels;
public $task;
/**
* TaskAdded constructor.
* 构造函数,注入一个Task实例
* @param Task $task
*/
public function __construct(Task $task)
{
$this->task = $task;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
3.在EventServiceProvider添加属性$subscribe
protected $subscribe = [TaskToLogListener::class];
4.触发事件
Event::fire(new TaskAdded($task));
Event::fire(new TaskDeled($task));