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.
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:
- Borrar recurso imagen
- 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