Eventos de modelos en Laravel

Eventos de modelos en Laravel


  • Share on Pinterest

Eventos disponibles

  • retrieved (Cuando un registro se trae de la base de datos)
  • creating
  • created
  • updating
  • updated
  • saving
  • saved
  • deleting
  • deleted
  • restoring
  • restored
  • replicating

Los eventos con terminación “ing” se disparan antes y los que terminan en “ed” después de una operación.

Eventos de modelos usando closures:

En esta forma para escuchar los eventos del modelo se utiliza una función anónima (closure) y se implementa directamente en la clase del modelo dentro del método ‘booted’.

Ejemplo:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function booted()
    {
        static::created(function ($user) {
            // Lógica para hacer algo con la instancia del modelo.
        });
    }
}

Eventos de modelos usando observers

En esta forma de escuchar eventos del modelo se implementa un clase que se encargará de escuchar los eventos (aplican todos los eventos listados arriba).

Para crear la clase (observer) que escuchará los eventos se utiliza el siguiente comando:

php artisan make:observer UserObserver --model=User

Después de ejecutar el comando se creará un directorio (en caso de no existir): App/Observers con el nuevo observer.

Posteriormente se debe registrar el observer en App\Providers\AppServiceProvider para versiones menores de Laravel 7.x y en App\Providers\EventServiceProvider para versiones mayores.

Se deberá registrar en el método boot, ejemplo:

use App\Models\User;
use App\Observers\UserObserver;

/**
 * Register any events for your application.
 *
 * @return void
 */
public function boot()
{
    User::observe(UserObserver::class);
}

Ejemplo de clase observer creada:

<?php

namespace App\Observers;

use App\Models\User;

class UserObserver
{
    /**
     * Handle the User "created" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }

    /**
     * Handle the User "updated" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        //
    }

    /**
     * Handle the User "deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function deleted(User $user)
    {
        //
    }

    /**
     * Handle the User "forceDeleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function forceDeleted(User $user)
    {
        //
    }
}