web-dev-qa-db-ja.com

Laravel 4モデルイベントを聞く方法は?

モデルイベントupdatingにバインドするイベントリスナーが必要です。
たとえば、投稿が更新された後、更新された投稿のタイトルを通知するアラートがあります。通知を受け取るイベントリスナーを作成する方法(投稿のタイトルの値がリスナーに渡されますか?)

15
JackpotK

ドキュメントには、 モデルイベント と簡単に記載されています。それらはすべてモデルにヘルパー関数を持っているので、それらがどのように構築されているかを知る必要はありません。

Eloquentモデルはいくつかのイベントを発生させ、次の方法を使用してモデルのライフサイクルのさまざまなポイントにフックできるようにします:作成、作成、更新、更新、保存、保存、削除、削除。イベントの作成、更新、保存、または削除からfalseが返された場合、アクションはキャンセルされます。


Project::creating(function($project) { }); // *
Project::created(function($project) { });
Project::updating(function($project) { }); // *
Project::updated(function($project) { });
Project::saving(function($project) { });  // *
Project::saved(function($project) { });
Project::deleting(function($project) { }); // *
Project::deleted(function($project) { });

*とマークされた関数からfalseを返すと、操作はキャンセルされます。


詳細については、 Illuminate/Database/Eloquent/Model を確認すると、そこにすべてのイベントがあり、static::registerModelEventおよび$this->fireModelEventの使用法を探します。

Eloquentモデルのイベントは、eloquent.{$event}: {$class}として構造化され、モデルインスタンスをパラメーターとして渡します。

18
Phill Sparks

この投稿: http://driesvints.com/blog/using-laravel-4-model-events/

モデル内で「boot()」静的関数を使用してイベントリスナーを設定する方法を示します。

class Post extends eloquent {
    public static function boot()
    {
        parent::boot();

        static::creating(function($post)
        {
            $post->created_by = Auth::user()->id;
            $post->updated_by = Auth::user()->id;
        });

        static::updating(function($post)
        {
            $post->updated_by = Auth::user()->id;
        });
    }
}

@ phill-sparksが彼の回答で共有したイベントのリストは、個々のモジュールに適用できます。

36
Rex Schrader

Event:listen( 'user.created'、function($ user)のようなデフォルトのモデルイベントへのサブスクライブが機能すると想定したため、これに固執しました(コメントで述べたように)。デフォルトモデルのユーザー作成イベントの例では、次のようになります。

//This will work in general, but not in the start.php file
User::created(function($user).... 
//this will work in the start.php file
Event::listen('eloquent.created: User', function($user).... 
7
Sabrina Leggett
Event::listen('eloquent.created: ModelName', function(ModelName $model)   {
    //...
})
0
Orange_shadow