Observer laravel

Los observer en laravel se utilizan principalmente para lanzar acciones adicionales secundarias con el hecho de ejecutar una acción principal. Normalmente son acciones repetitivas que están a la escucha y condicionan el resultado final.

Índice
  1. Laravel model observer
  2. Cómo crear un observer

Laravel model observer

En modelos de Laravel, un Observer se mantiene a la escucha de cualquier cambio se realice en el modelo escogido, para entoces terminar de realizar acción como insertar, actualizar o borrar datos en el registro en ejecución.

Ejemplo de Laravel model observer

Por ejemplo, Hay que guardar en la base de datos un registro con tres campos:

  • Nombre
  • Tipo (tipo1 y tipo2)
  • Url (dependiente del tipo)

Con un formulario el usuario puede guardar los campos de Nombre y Tipo. Pero el tercer campo está oculto y se guarda en función del tipo.

Si es de tipo1, el observer guarda la url guarda "urldetipo1"
Si es de tipo2, el observer guarda la url guarda "urldetipo2"

Cómo crear un observer

Para crear un observer se puede hacer desde la consola terminal con el comando make:observer seguido del nombre del modelo y la palabra Observer

php artisan make:observer NombremodeloObserver

Este comando genera el siguiente fichero en la carpeta Observers

app\Observers\NombremodeloObserver.php

Implementar un observer

Dentro del fichero creado Observer, hay que importar al modelo al que se hace referencia, con use App\Models\Nombremodelo.

Se crean las funciones de creating y updating, para estar a la escucha de cuando se crea un registro o bien cuando se actualice un registro existente.

Observer creating para crear o insertar

Hay que crear una función con el nombre creating, y pasar por parámetro el modelo donde operar.

<?php

namespace App\Observers;

use App\Models\Nombremodelo;

class NombremodeloObserver
{

 public function creating(Nombremodelo $item){
        
  $tipo= $item->tipo;


  if($tipo == 1){

   $item->url = 'urldetipo1';

  }else{
   
   $item->url = 'urldetipo2';

  }
 }
}

Observer updating para actualizar

Hay que crear una función con el nombre updating, y pasar por parámetro el modelo donde operar.

<?php

namespace App\Observers;

use App\Models\Nombremodelo;

class NombremodeloObserver
{
  public function updating(Nombremodelo $item){
        
  $tipo= $item->tipo;


  if($tipo == 1){

   $item->url = 'urldetipo1';

  }else{
   
   $item->url = 'urldetipo2';

  }
 }
}

Observer deleting para eliminar

Hay que crear una función con el nombre deleting y pasar por parámetro el modelo donde operar. Es muy útil para borrar ficheros o imágenes adicionalmente a la base de datos, en modelos que no están relacionados o bien tengan una relación polimórfica.

En este ejemplo comprobar primero que tiene un recurso y despues borrar en dos pasos:

  1. Borrar recurso imagen
  2. Borrar de la base de datos
<?php

namespace App\Observers;

use App\Models\Nombremodelo;

class NombremodeloObserver
{
 public function deleting(Nombremodelo $item){
  if($item->resource){
   Storage::delete($item->resource->url);
   $lesson->resource->delete();
   }
  }
}

Registrar un observer

No basta con crear un fichero Observer, si no que para que funcione hay que registrarlo. En este caso se llama dentro del fichero AppServiceProvider

app\Providers\AppServiceProvider.php

Después hay que llamar al modelo y al Observer creado con "use"

use App\Models\Modelo;
use App\Observers\NombremodeloObserver;

Y finalmente utilizarlo dentro del la función boot, llamando al método observe del modelo

public function boot()
{
 Modelo::observe(NombremodeloObserver::class);
        
 Blade::directive('routeIs', function ($expression) {
   return "<?php if(Request::url() == route($expression)): ?>";
 });
}

Con esto sería suficiente para que el observer quede a la escucha para insertar o actualizar registros del modelo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir