1. 程式人生 > >Laravel之事件

Laravel之事件

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之事件