> Faqs > Cómo ejecutar código al modificarse o crearse un recurso en Laravel Nova como un hook

Cómo ejecutar código al modificarse o crearse un recurso en Laravel Nova como un hook

Quisiera encontrar la forma de ejecutar código, como una especie de hook, al producirse cualquier acción sobre un recurso con Laravel Nova.

Esto sería más o menos como capturar eventos de edición, borrado o creación de elementos en la base de datos, para producir las acciones necesarias en tablas diferentes a la que se está trabajando.

Por ejemplo, estoy editando el precio de un producto y quisiera que se actualizase automáticamente el precido de todos los packs que incluyen ese producto. Justamente la idea de capturar esos eventos como si fuera con hooks es para no tener que editar luego manualmente todos los packs que incluyen este producto, sino que se actualicen solos.

Respuestas

Esto lo tendrías que realizar por medio de los observers del modelo.

Los observers de modelos Eloquent permiten enganchar código para cuando ocurre cualquier operación de manipulación de los elementos del tipo de ese modelo.

Por ejemplo en tu caso tendrás que crear un observer para el modelo de producto. En ese observer puedes crear cualquier serie de operativas, como la de actualizar los precios de los packs.

Lee la documentación de Laravel para tener más datos, pero básicamente los pasos son los siguientes:

Crear el observer:

php artisan make:observer ProductObserver --model=Product

Esto creará el observer, en la carpeta app/observers, que tendrá métodos como estos:

public function created(Product $product)
{
    // Aquí pones por ejemplo la operativa a producirse cuando se crea un elemento de este modelo
}

public function updated(Product $product)
{
    // Código a ejecutar cuando se produzca una actualización del producto
}

Ahora te toca registrar el observer. Esto lo tienes que realizar en cualquier "ServiceProvider". Podría servirte como dicen en la documentación de Laravel el AppServiceProvider, pero si lo que quieres es que ese observer solo esté disponible dentro de Nova, creo que lo más lógico sería hacer el registro en el NovaServiceProvider.

El observer del modelo Laravel Eloquent lo registras desde el método boot(), de esta manera:

use App\Product;
use App\Observers\ProductObserver;

class NovaServiceProvider extends NovaApplicationServiceProvider
{

    public function boot()
    {
        parent::boot();
        Product::observe(ProductObserver::class);
    }
    
    //...
}
Miguel Angel
3310 147 216 17