Laravel モデルイベントを使用すると、モデルのライフサイクルの複数のキーポイントを監視したり、モデルの保存や削除を防ぐこともできます。 Laravel モデルイベントのドキュメントでは、フックを使用して対応するイベントを関連イベントタイプに関連付ける方法の概要が説明されていますが、この記事の主な焦点は、イベントとリスナーの構築とセットアップであり、いくつかの追加の詳細も含まれます。
イベント概要
Eloquent には、フックを使用してイベントを接続し、モデルにカスタム機能を追加できるイベントが多数あります。モデルは次のイベントで始まります:
retrieved
creating
created
updating
updated
Saving
saved
deleting
deleted
restoreing
restored
これらについては、ドキュメントから学ぶことができます。どのように実装されていますか? Model の基本クラスを入力して、どのように実装されているかを確認することもできます:
既存のモデルがデータベースから取得されると、取得されたイベントがトリガーされます。新しいモデルを初めて保存すると、作成イベントと作成イベントが発生します。データベースにすでに存在するモデルに対して save メソッドが呼び出された場合、更新/更新イベントがトリガーされます。いずれにせよ、どちらの場合でも、保存 / 保存されたイベントが発生します。
このドキュメントでは、モデル イベントの概要を示し、フックを使用してイベントを関連付ける方法について説明していますが、初心者であるか、フックを使用してイベント リスナーをこれらのカスタマイズに接続する方法に慣れていない場合は、モデル イベントは次のとおりです。関連する場合は、この記事をさらに読んでください。
イベントの登録
モデル内でイベントを関連付けるには、最初に $dispatchesEvents プロパティを使用してイベント オブジェクトを登録する必要があります。最終的には、fireModelEvent() メソッドによって呼び出される HasEvents::fireCustomModelEvent() メソッドによってトリガーされます。元の fireCustomModelEvent() メソッドはおおよそ次のとおりです。
/** * 为给定的事件触发一个自定义模型。 * * @param string $event * @param string $method * @return mixed|null */ protected function fireCustomModelEvent($event, $method) { if (! isset($this->dispatchesEvents[$event])) { return; } $result = static::$dispatcher->$method(new $this->dispatchesEvents[$event]($this)); if (! is_null($result)) { return $result; } }
delete などのいくつかのイベントが検出され、イベントが false を返して操作を終了するかどうかが判断されます。たとえば、このフックを使用して何らかの検出を行い、ユーザーの作成または削除を防ぐことができます。
例として App\User モデルを使用して、モデル イベントを構成する方法を示します:
protected $dispatchesEvents = [ 'saving' => \App\Events\UserSaving::class, ];
artisan make:event コマンドを使用してこのイベントを作成できますが、基本的には次のとおりです。最終的には次のようになります。
<?php namespace App\Events; use App\User; use Illuminate\Queue\SerializesModels; class UserSaving { use SerializesModels; public $user; /** * 创建一个新的事件实例 * * @param \App\User $user */ public function __construct(User $user) { $this->user = $user; } }
私たちのイベントは、保存イベント中に User モデル インスタンスにアクセスできるように、パブリック $user プロパティを提供します。
これを機能させるために次に行う必要があるのは、このイベントの実際のリスナーを設定することです。モデルのトリガー時間を設定し、User モデルが保存イベントをトリガーすると、リスナーが呼び出されます。
イベント リスナーの作成
次に、User モデルを定義し、トリガーされる保存イベントをリッスンするイベント リスナーを登録します。モデル オブザーバーを使用するとこれをすぐに実行できましたが、個々のイベント トリガーのイベント リスナーを構成する手順を説明したいと思います。
イベント リスナー Laravel の他のイベント リスナーと同様に、handle() メソッドは App\Events\UserSaving イベント クラスのインスタンスを受け取ります。
手動で作成することも、phpArtisan make:listener コマンドを使用することもできます。とにかく、次のようなリスナー クラスを作成します。
<?php namespace App\Listeners; use App\Events\UserSaving as UserSavingEvent; class UserSaving { /** * 处理事件。 * * @param \App\Events\UserSavingEvent $event * @return mixed */ public function handle(UserSavingEvent $event) { app('log')->info($event->user); } }
リスナーに渡されたモデルを簡単に検査できるように、ログ呼び出しを追加しました。これを行うには、EventServiceProvider::$listen プロパティにリスナーを登録する必要もあります。
<?php namespace App\Providers; use Illuminate\Support\Facades\Event; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * 应用的事件监听器。 * * @var array */ protected $listen = [ \App\Events\UserSaving::class => [ \App\Listeners\UserSaving::class, ], ]; // ... }
これで、モデルが保存イベントを呼び出すと、登録したイベント リスナーもトリガーされて実行されます。
イベント モニタリングを試してみる
ティンカー セッションを通じてイベント モニタリング コードをすぐに生成できます:
php artisan tinker >>> factory(\App\User::class)->create(); => App\User {#794 name: "Aiden Cremin", email: "josie05@example.com", updated_at: "2018-03-15 03:57:18", created_at: "2018-03-15 03:57:18", id: 2, }
イベントとリスナーを正しく登録した場合は、 laravel.log ファイルでモデルの JSON 式を確認できるはずです。
[2018-03-15 03:57:18] local.INFO: {"name":"Aiden Cremin","email":"josie05@example.com"}
注意すべき点の 1 つは、現時点ではモデルには created_at または updated_at 属性がないことです。モデル上で save() が再度呼び出される場合、新しく作成されたレコードまたは既存のレコードに対して保存イベントが発生するため、ログにタイムスタンプを持つ新しいレコードが作成されます。
>>> $u = factory(\App\User::class)->create(); => App\User {#741 name: "Eloisa Hirthe", email: "gottlieb.itzel@example.com", updated_at: "2018-03-15 03:59:37", created_at: "2018-03-15 03:59:37", id: 3, } >>> $u->save(); => true >>>
保存を停止します。操作
一部のモデル イベントでは、ブロック操作を実行できます。ばかげた例を挙げると、どのユーザーのモデルも属性 $user->name を保存できないとします。内容は Paul:
/** * 处理事件。 * * @param \App\Events\UserSaving $event * @return mixed */ public function handle(UserSaving $event) { if (stripos($event->user->name, 'paul') !== false) { return false; } }
Eloquent の Model::save() メソッドでは、イベント監視の戻り結果により、保存を停止するかどうかが決まります:
public function save(array $options = []) { $query = $this->newQueryWithoutScopes(); // 如果 "saving" 事件返回 false ,我们将退出保存并返回 // false,表示保存失败。这为服务监听者提供了一个机会, // 当验证失败或者出现其它任何情况,都可以取消保存操作。 if ($this->fireModelEvent('saving') === false) { return false; }
この save() は良い例です。これは、モデルのライフ サイクルでイベントをカスタマイズし、ログ データの記録を受動的に実行する方法を示しています。またはタスクのスケジュール設定。
オブザーバーの使用
複数のイベントをリッスンしている場合は、オブザーバー クラスを使用してイベントをタイプ別にグループ化すると便利な場合があります。 Eloquent オブザーバーの例を次に示します。
<?php namespace App\Observers; use App\User; class UserObserver { /** * 监听 User 创建事件。 * * @param \App\User $user * @return void */ public function created(User $user) { // } /** * 监听 User 删除事件。 * * @param \App\User $user * @return void */ public function deleting(User $user) { // } }
サービス プロバイダー AppServiceProvider の boot() メソッドでオブザーバーを登録できます。
/** * 运行所有应用服务。 * * @return void */ public function boot() { User::observe(UserObserver::class); }
推荐教程:《Laravel教程》
以上がLaravel モデルイベントのクイックスタートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。