Laravel 6モデルイベントの使用
Laravel 6モデルイベントの使用
サポートされているすべてのモデルイベントがEloquentモデルクラスでクエリー、挿入、更新、削除されると、それらをリスニングしているかどうかにかかわらず、対応するモデルイベントがトリガーされます.次のようなイベントがあります.
retrieved
モデルインスタンスを取得するとトリガーされます
creating
データベースに挿入する前にトリガー
created
データベースに挿入するとトリガーされます
updating
データベースに更新する前にトリガー
updated
データベースに更新するとトリガーされます
saving
データベースに保存する前にトリガーされます(挿入/更新する前に、挿入または更新にかかわらずトリガーされます).
saved
データベースに保存するとトリガーされます(挿入/更新すると、挿入または更新にかかわらずトリガーされます).
deleting
データベースからレコードを削除する前にトリガー
deleted
データベースからレコードを削除するとトリガーされます
restoring
ソフト削除レコードを復元する前にトリガー
restored
ソフト削除レコードの復元後にトリガー
注意:バッチ更新では、クエリー・ビルダーを直接移動するため、モデル・メソッドを迂回したため、対応するイベントはトリガーされません.
これらのイベントをリスニングすることで、Eloquentモデルインスタンスのライフサイクルの特定のフェーズで特定の操作を実行できます.Laravelでは、モデルイベントをリスニングする方法がいくつかあります.
一、静的方法でモデルイベントを傍受する
モデルクラスでリスニングするイベントに対応する静的メソッドを呼び出すことによって、一般に、
上記のコードでは、
二、サブスクライバによるモデルイベントの傍受
1.対応するイベントクラスを作成する
クエリー・モデルを例に説明します.Artisanコマンドを使用して、イベントクラスの初期化を行います.
次に、このイベントクラスに$userプロパティを追加し、コンストラクション関数に入力します.
2.モデルイベントとカスタムイベントクラスのマッピングの確立
これにより、クエリー・イベントがトリガーされると、最下位レベルは
3.サブスクライバリスニングイベントクラスの作成
また、上記のカスタムイベントクラスもリスニングします.
4.
クエリー・コードの実行
ログの表示
出力結果
サポートされているすべてのモデルイベントが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.サブスクライバリスニングイベントクラスの作成
また、上記のカスタムイベントクラスもリスニングします.
EventServiceProvider
のlisten
プロパティで、対応するリスナークラスをイベントごとにバインドするか、モデルクラスに
を作成することで、モデル内のすべてのイベントを統一的に処理できます.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