16 votes

Laravel 4 : comment écouter un événement de modèle ?

Je veux qu'un écouteur d'événement soit lié à un événement du modèle. updating .
Par exemple, après la mise à jour d'un article, il y a une alerte notifiant le titre de l'article mis à jour, comment écrire un écouteur d'événement pour avoir la notification (avec la valeur du titre de l'article passant à l'écouteur) ?

37voto

Rex Schrader Points 518

Cet article : http://driesvints.com/blog/using-laravel-4-model-events/

Montre comment mettre en place des récepteurs d'événements à l'aide de la fonction statique "boot()" à l'intérieur du modèle :

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;
        });
    }
}

La liste d'événements que @phill-sparks a partagée dans sa réponse peut être appliquée à des modules individuels.

19voto

Phill Sparks Points 18340

La documentation mentionne brièvement Modèles d'événements . Ils ont tous une fonction d'aide sur le modèle, de sorte que vous n'avez pas besoin de savoir comment ils sont construits.

Les modèles Eloquent déclenchent plusieurs événements, ce qui vous permet de vous connecter à différents points du cycle de vie du modèle en utilisant les méthodes suivantes : création, created, updating, updated, saving, saved, deleting, deleted. Si l'événement de création, de mise à jour, d'enregistrement ou de suppression renvoie la valeur false, l'action est annulée.


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) { });

Si vous retournez false à partir des fonctions marquées * ils annuleront l'opération.


Pour plus de détails, vous pouvez consulter Illuminer/Base de données/Eloquent/Modèle et vous y trouverez tous les événements, recherchez les utilisations de static::registerModelEvent y $this->fireModelEvent .

Les événements sur les modèles Eloquent sont structurés comme suit eloquent.{$event}: {$class} et transmet l'instance de modèle en tant que paramètre.

7voto

Sabrina Gelbart Points 1028

Je suis resté bloqué sur ce point parce que j'ai supposé que s'abonner aux événements du modèle par défaut comme Event:listen('user.created',function($user) aurait fonctionné (comme je l'ai dit dans un commentaire). Jusqu'à présent, j'ai vu ces options fonctionner dans l'exemple du modèle par défaut de l'événement user created :

//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)....

0voto

Orange_shadow Points 1
Event::listen('eloquent.created: ModelName', function(ModelName $model)   {
    //...
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X