Laravel之事件


一.事件

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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM