Laravel 6モデルイベントの使用

10990 ワード

Laravel 6モデルイベントの使用
サポートされているすべてのモデルイベントがEloquentモデルクラスでクエリー、挿入、更新、削除されると、それらをリスニングしているかどうかにかかわらず、対応するモデルイベントがトリガーされます.次のようなイベントがあります.
retrieved
モデルインスタンスを取得するとトリガーされます
creating
データベースに挿入する前にトリガー
created
データベースに挿入するとトリガーされます
updating
データベースに更新する前にトリガー
updated
データベースに更新するとトリガーされます
saving
データベースに保存する前にトリガーされます(挿入/更新する前に、挿入または更新にかかわらずトリガーされます).
saved
データベースに保存するとトリガーされます(挿入/更新すると、挿入または更新にかかわらずトリガーされます).
deleting
データベースからレコードを削除する前にトリガー
deleted
データベースからレコードを削除するとトリガーされます
restoring
ソフト削除レコードを復元する前にトリガー
restored
ソフト削除レコードの復元後にトリガー
注意:バッチ更新では、クエリー・ビルダーを直接移動するため、モデル・メソッドを迂回したため、対応するイベントはトリガーされません.
これらのイベントをリスニングすることで、Eloquentモデルインスタンスのライフサイクルの特定のフェーズで特定の操作を実行できます.Laravelでは、モデルイベントをリスニングする方法がいくつかあります.
一、静的方法でモデルイベントを傍受する
モデルクラスでリスニングするイベントに対応する静的メソッドを呼び出すことによって、一般に、bootなどのサービスプロバイダのEventServiceProviderメソッドでこの作業を完了します.たとえば、モデルインスタンスを取得するたびにイベントをリスニングし、クエリーされたユーザー情報をログに記録するとします.
// app/Providers/EventServiceProvider.php

public function boot()
{
    parent::boot();
    //         
    User::retrieved(function ($user) {
        Log::info('        [' . $user->id . ']:' . $user->name);
    });
}

上記のコードでは、Userモデル上でretrievedイベントをリスニングし、対応する処理ロジックを1つの閉パケット関数で実行することを示しています.この閉パケット関数の入力パラメータはモデルインスタンスであり、処理ロジックでは、Logゲートを介してログ情報を記録します.
二、サブスクライバによるモデルイベントの傍受
1.対応するイベントクラスを作成する
クエリー・モデルを例に説明します.Artisanコマンドを使用して、イベントクラスの初期化を行います.
php artisan make:event UserRetrieved

次に、このイベントクラスに$userプロパティを追加し、コンストラクション関数に入力します.
// app/Events/UserDeleted.php
// app/Events/UserDeleting.php

public $user;
public function __construct(User $user)
{
    $this->user = $user;
}

2.モデルイベントとカスタムイベントクラスのマッピングの確立Userモデルクラスでモデルイベントとカスタムイベントクラスのマッピングを確立します.これは、$dispatchesEventsプロパティで実行できます.
//                
 protected $dispatchesEvents = [
        'retrieved' => UserRetrieved::class
 ];

これにより、クエリー・イベントがトリガーされると、最下位レベルはUserRetrievedイベントに変換されます.
3.サブスクライバリスニングイベントクラスの作成
また、上記のカスタムイベントクラスもリスニングします.EventServiceProviderlistenプロパティで、対応するリスナークラスをイベントごとにバインドするか、モデルクラスに を作成することで、モデル内のすべてのイベントを統一的に処理できます.app/Listenersディレクトリの下にUserEventSubscriber.phpファイルを購読者クラスとして作成し、コードを次のように記述します.


namespace App\Listeners;

use App\Events\UserDeleted;
use App\Events\UserDeleting;
use Illuminate\Support\Facades\Log;

class UserEventSubscriber
{
     /**
     *          
     */
    public function onUserRetrieved($event)
    {
        Log::info('weihang ======>       [' . $event->user->id . ']:' . $event->user->name);
    }

    /**
     *          
     *
     * @param  Illuminate\Events\Dispatcher $events
     */
    public function subscribe($events)
    {
        $events->listen(
            UserRetrieved::class,
            UserEventSubscriber::class . '@onUserRetrieved'
        );
    }
}

4.EventServiceProviderにこの購読者を登録する
// app/Providers/EventServiceProvider.php

protected $subscribe = [
    UserEventSubscriber::class
];

クエリー・コードの実行
//UserModel 
$data = UserModel ::find(3);

ログの表示
cat laravel.log

出力結果
[2020-03-04 03:27:07] local.INFO: weihang ======>       [3]:weihang4