Laravel之事件
阿新 • • 發佈:2017-06-02
param ann acad 依靠 操作 nat contract nds 註入
一.事件
事件無處不在,比如用戶登錄、購買商品、搜索、查看文章,等等,都是事件,有了事件,就有事件監聽器,事件監聽器監聽到事件發生後會執行一些操作,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\[email protected]); $events->listen(‘App\Events\TaskDeled‘,‘App\Listeners\[email protected]); } }
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));
Laravel之事件