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