Pablo Andrés Pineda Granada
Aunque debo decir que la documentación de Laravel es pedagógicamente muy agradable, ¿Por qué no se explico a fondo estos conceptos de los Observers?
Insisto, Una pena este curso.
Aprovecha los eventos de Eloquent para automatizar tareas críticas del ciclo de vida de tus modelos. Aquí verás cómo, al crear un producto, se genera una imagen con Faker y se asigna el usuario logueado; además, cómo preparar la migración para una nueva columna y por qué conviene mover esta lógica a un observer para mantener el modelo limpio.
¿Qué son los eventos de Eloquent y cómo se usan en el modelo?
Los eventos de Eloquent permiten capturar momentos del ciclo de vida de un modelo. La forma directa de usarlos es sobrescribir el método estático booted y engancharse al evento creating, que se ejecuta antes de crear la entidad. Así, el producto recibe una URL aleatoria para su imagen usando Faker y se asocia al usuario autenticado mediante el helper auth.
Puntos clave:
Ejemplo dentro del modelo Product:
protected static function booted() { static::creating(function ($product) { $faker = \Faker\Factory::create(); // URL aleatoria para la imagen. $product->image_url = $faker->url; // Asociar el usuario que está logueado en la relación createdBy. $product->createdBy()->associate(auth()->user()); }); }
¿Cómo preparar la base de datos con una migración segura?
Antes de probar, se necesita la columna en base de datos. La indicación es crear una migración que agregue el campo de tipo texto para la image_url y permitir nulos para no afectar productos existentes. Luego, completar el método down para poder hacer rollback si es necesario.
Pasos esenciales:
image_url como text y nullable.down para borrar la columna en caso de rollback.Migración de ejemplo:
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up(): void { Schema::table('productos', function (Blueprint $table) { $table->text('image_url')->nullable(); }); } public function down(): void { Schema::table('productos', function (Blueprint $table) { $table->dropColumn('image_url'); }); } };
Y luego ejecutar:
php artisan migrate
¿Por qué mover la lógica a un observer de Eloquent?
Aunque es válido colocar esta lógica en el modelo, la recomendación final es migrarla a un observer para que el modelo quede lo más limpio posible. Con un observer, centralizas la lógica de eventos (creating, entre otros) fuera del modelo, manteniendo mejor separación de responsabilidades y un código más mantenible.
Beneficios al usar un observer:
Revisa la documentación oficial para crear el observer y mover toda la lógica de negocio allí. Después, estarás listo para la introducción al uso de queues y jobs.
¿Te quedó alguna duda sobre los eventos de Eloquent, Faker o la migración? Comenta y con gusto te ayudo a resolverla.
OBSERVERS esto que vimos son los eventos de eloquent , podemos utilizarlos para crear datos al crear una entidad o en cualquier parte del ciclo de vida
ya que es un poco sucio ver todo esto en el model existen los observers Observers Si estas "listening" a muchos events podes tener un observer de este Model para tener todo mas limpio
1 php artisan make:observer ProductObserver --model=Product //App/Observers/ProductObserver.php
2 aca nos ahorramos todo lo de booted y creating que hicimos en el Model
Laravel nos da el observer para elejiir en que parte del ciclo de vida queremos interactuar
sacamos lo del model y lo ponemos en created
class ProductObserver {
public function created(Product $product) { $faker = \Faker\Factory::create(); $product->image_url = $faker->imageUrl(); $product->createdBy()->associate(auth()->user()); } public function updated(Product $product) { // } public function deleted(Product $product) { // } public function restored(Product $product) { // } public function forceDeleted(Product $product) { // }
}
Pablo Andrés Pineda Granada
Aunque debo decir que la documentación de Laravel es pedagógicamente muy agradable, ¿Por qué no se explico a fondo estos conceptos de los Observers?
Insisto, Una pena este curso.
JUAN CAMILO MUNERA GOMEZ
usar faker para la creación de la imagen en el modelo productos ? entonces para que tienes factory's ?? con todo respeto pero que desorden de código, no explica bien, no lleva las convenciones de laravel, y aparte "te reta" hacer algo que en realidad él no ha explicado ? HE VISTO MEJORES CURSO Y GRATIS.
Mariano Gastón Paduani
La verdad que es una decepción este curso
Fernando Mejia
Un punto intermedio entre manejar callbacks en el modelo usando el metodo boot() y un observable es usar la propiedad protegida $dispatchesEvents en el modelo:
protected $dispatchesEvents = [ 'created' => YourEvent::class ];
Esto puede ser util en casos donde mi modelo tiene pocos eventos y crear un observable puede ser demasiado para solo uno dos eventos, sin embargo si excede si es mejor usar observables para no tener modelos demasiado largos, aunque todo es me imagino a la convención que sientas mas correcta al momento de escribir tu código.
Atahualpa Silva Falcón
Por si acaso les dejo el link para comprender y profundizar en el tema desde la propia documentación de Laravel:
Opinión: Para poder realizar retos deberíamos primero entender un poco la implementación y su funcionamiento en la práctica. Este tipo de cursos y clases deberían refinarse si o si, ya que en lo personal confunden y desaniman a continuar con el mismo.
Mariano Gastón Paduani
Coincido totalmente!
Jean Nuñez
con el evento booted , lo cual, se inicia cuando es llamado el modelo podemos hacer diferentes cosas, como: Hacer CRUD
Kenneth Angulo L
Tambien tengo una duda, dentro del observer en el metodo created(), escribi: $product->save();
Sin esa linea el registro no se almacena en la base datos, y por supuesto eso activa una actualizacion (el observer la esta reportando)
A alguien mas le paso ? Eso es correcto ?
no se si estoy omitiendo algo !
Kenneth Angulo L
Dejo por aqui un resumen de lo que hay que hacer:
Crear el observer:
php artisan make:observer ProductObserver --model=Product
<?php
class ProductObserver
{
public function created(Product $product): void
{
dispatch(function () {
logger('Estoy Observando: Se ha creado un producto');
});
$faker = Factory::create();
$product->image = $faker->imageUrl();
// $product->created_by()->associate(auth()->user());
$product->save();
}
Luego registrar el observer en AppServiceProvider:
public function boot(): void
{
Product::observe(ProductObserver::class);
}
Esta seria una prueba rapida (lo se, mas pro seria hacer un pest, pero para el ejercicio lo encuentro mas rapido asi)
Juan Guillermo Perez Cardozo
jumm debo hacer mucha investigacion antes de continuar
Atahualpa Silva Falcón
Para los que hagan el reto, recuerden que no basta con crear el Observer y el Evento, también tienen que indicarle a Laravel que quieren hacer uso del Observer, en este caso en el "EventServiceProvider" en el método "boot" hacen el respectivo registro del "ProductObserver".
/** EventServiceProvider.php */ public function boot() { Product::observe(ProductObserver::class); }
Atahualpa Silva Falcón
Aquí les dejo el link de la documentación por si quieren profundizar en el tema
Fernando Mejia
Ojo un detalle para quien migre la logica a observables , estos estan pendientes de eventos ligados a modelos, por ejemplo modelo Post puede tener algun evento al momento de ser creado:
public function created() { // avisar que hay nuevos posts con una notificacion }
Sin embargo el metodo "updated" tiene un detalle a veces modificamos un valor usando eloquent pero los timestamps no cambian, en este caso el código evento dentro del metodo "updated()", nunca se ejecutara en estas situaciones para "forzar" que se ejecute se puede usar el metodo "touch" en el modelo asi obligamos al modelo a actualizarse.
Esto no es tan comun pero puede darse el caso de uso cuando usamos un metodo "createOrUpdate" por ejemplo en un modelo de eloquent.
Jean Nuñez
Los eventos de eloquent nos permite capturar el ciclo de video de un modelo
Darío Rugerio
🤯Dioos cuantas quejas en los comentarios!! Sigan el repositorio tal como dice el prof LINK A mi me parece una práctica genial dejar tareas y hacer investigación cuando es necesario, por ello el curso es AVANZADO y considero que este tipo de tareas ayudan a fortalecer el tema.