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:
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:
1 2 3 |
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:
1 2 3 4 5 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Product extends Model { protected $events = [ 'updated' => App\Events\ProductUpdated::class, ]; } |
Material relacionado
Únete a la discusión
Regístrate en Styde y obtén una invitación a nuestro Slack.
Aprende desarrollo web con Laravel, Vue.js y mucho más a partir de 9 USD al mes: ver planes.
Lección anterior Traducciones basadas en JSON en Laravel 5.4 Lección siguiente Uso de Markdown en los Mailables en Laravel 5.4