Eloquent, el ORM de Laravel, dispara una serie de eventos antes y después de crear, actualizar o eliminar registros. Por ejemplo tenemos eventos como «creating» y «created» o «saving» y «saved». Hasta Laravel 5.3 podíamos asociar dichos eventos a callbacks usando una sintaxis como: Event::list(«eloquent.created: App\Post», $callback)  o App\Post::created($callback).

Sin embargo, desde hace varias versiones, Laravel nos permite trabajar con eventos y listeners utilizando clases y a partir de Laravel 5.4 también podemos definir clases para los modelos de Eloquent de una forma muy sencilla como veremos en la siguiente lección:

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Notas

Por Clemir Rondón.

En Laravel 5.3 y versiones anteriores podemos en el método boot() del  archivo  /app/Providers/EventServiceProvider.php agregar:

Event::listen('eloquent.updated: App\Product', function ($product) {
    dd('Actualizando producto', $product->toArray());
});

Con lo cual se ejecutará al dispararse el evento updated del modelo Product.

Como alternativa, también puedes tener la clase evento ProductUpdated y una clase listener SendProductUpdatedConfirmation y agregarlo al array $listen de /app/Providers/EventServiceProvider.php de esta manera:

protected $listen = [
    'App\Events\ProductUpdated' => [
       'App\Listeners\SendProductUpdatedConfirmation',
    ],
];

En la lección Crea y dispara tus propios eventos con Laravel te explicamos cómo generar automáticamente estas clases con el comando de artisan php artisan event:generate. Además, en las lecciones de nuestro  Curso de Eventos y Jobs con Laravel se explica con detalle cómo funcionan los eventos en Laravel.

Sin embargo, para Laravel 5.4  podemos asociar un evento como por ejemplo ProductUpdated a un modelo de forma sencilla, agregando una propiedad llamada $events en la clase del modelo, donde le asignas evento con la respectiva clase que quieres que se dispare:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $events = [
        'updated' => App\Events\ProductUpdated::class,
    ];
}

Material relacionado

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Traducciones basadas en JSON en Laravel 5.4 Lección siguiente Uso de Markdown en los Mailables en Laravel 5.4