Los observers en Laravel son clases que tienen métodos que reflejan los eventos de un modelo en especifico, pueden ser algunos como:

    • created: evento que se ejecuta cuando se crea un registro en el modelo.
    • updated: evento que se ejecuta cuando se actualiza un registro en un modelo.
    • deleted: evento que se ejecuta cuando se elimina un registro de un modelo.

Un ejemplo más real de un observer sería el siguiente:

<?php

namespace App\Observers;

use App\User;

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

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

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

Como puedes ver, se genera una clase con métodos muy descriptivos y que reciben una instancia del modelo, en este caso, User.

¿Cuándo utilizar un observer?

Si tienes muchos eventos escuchando un modelo en específico, la mejor práctica sería mejor que crearás un observer para mantener mucho más limpios tus controladores.

Si quieres seguir con un desarrollo mantenible es mejor que utilices observers, no sólo por buenas prácticas, sino que ayudarás a futuros programadores o hasta a ti mismo, localizar issues en tu aplicación será mucho más sencillo.

En mi caso, he utilizado un observer para notificar a los administradores cada vez que un usuario se registra o se elimina en una aplicación web para uno de mis clientes.

¿Cómo se registra un observer?

Una vez que hayas ejecutado el comando php artisan make:observer UserObserver –model=User tendrás que registrar tu observer.

Lo puedes hacer desde tu AppServiceProvider de la siguiente manera:

<?php

namespace App\Providers;

use App\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}

Ahora tendrás una lista de eventos en los cuales puedes delegar toda la lógica de negocio y seguir con las mejores prácticas que Laravel te ofrece.

¿Tiene limitaciones?

En lo personal he desarrollado aplicaciones chicas y medianas con Laravel y no he encontrado ninguna limitación con ningún observer.

Lo que he escuchado es que hay una cierta limitación con un hook (saved) al llamar el método save de un modelo, la solución es que reconsideres la lógica si es muy necesario que utilices el método.

De ahí en fuera no he tenido ningún problema, al contrario, me han ayudado demasiado a abstraer mucha lógica de las aplicaciones que desarrollo.

Conclusión

Los observers ayudan a delegar lógica de negocio a los modelos, lo cual es una buena práctica ya que dejamos menos cargados a nuestros controladores y hacemos que cumplan su función de procesar y enviar una respuesta.

También, harán que tu aplicación tenga mucho menos complejidad a la hora de escalar y mantener.

Recuerda que puedes leer la documentación oficial de Laravel en donde explican a detalle el funcionamiento del marco: Observers Laravel