一.事件
事件無處不在,比如用戶登錄、購買商品、搜索、查看文章,等等,都是事件,有了事件,就有事件監聽器,事件監聽器監聽到事件發生后會執行一些操作,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));
