jueves, 31 de julio de 2025

Factory callbacks afterMaking y afterCreating de Laravel

Los factory callbacks afterMaking y afterCreating te permiten ejecutar código automáticamente después de que un modelo de prueba ha sido creado.

Ambos métodos son muy similares, pero se activan en momentos diferentes del proceso de creación del modelo.


afterMaking

El método afterMaking se ejecuta después de que la fábrica ha "fabricado" (o made) una instancia del modelo, pero antes de que ese modelo sea guardado en la base de datos.

  • ¿Cuándo se usa?

    • Cuando necesitas modificar o agregar datos a la instancia del modelo antes de que se guarde.

    • Cuando quieres vincular relaciones a través del modelo en memoria, pero sin guardar todavía los datos relacionados.

    • Cuando el modelo está completamente preparado, pero aún no tiene un id porque no ha sido persistido.

  • Ejemplo de uso:

    Imagina que necesitas generar una propiedad (token) que se basa en otros atributos del modelo, pero solo cuando se crea una instancia en memoria, sin guardarlo aún.

PHP
// Ejemplo en una fábrica de modelos de Laravel
public function configure(): static
{
    // ... otros callbacks
    
    return $this->afterMaking(function (User $user) {
        // Generar un token basado en los atributos del usuario antes de guardarlo
        $user->token = md5($user->email . now());
    });
}

afterCreating

El método afterCreating se ejecuta después de que la fábrica ha "creado" (o created) e insertado el modelo en la base de datos.

  • ¿Cuándo se usa?

    • Cuando necesitas vincular otros modelos a la instancia recién creada.

    • Cuando el modelo ya tiene un id y necesitas usarlo para establecer relaciones de uno a muchos o de muchos a muchos.

    • Cuando necesitas ejecutar lógica que depende de que el modelo exista en la base de datos (por ejemplo, disparar eventos o actualizar otros registros).

  • Ejemplo de uso:

    El caso de uso más común es crear modelos relacionados. Por ejemplo, después de crear un usuario, creas sus publicaciones o perfil.

PHP
// Ejemplo en una fábrica de modelos de Laravel
public function configure(): static
{
    // ... otros callbacks
    
    return $this->afterCreating(function (User $user) {
        // Crear un perfil para el usuario después de que el usuario ya existe en la base de datos
        // $user->profile()->create([...]);
        
        // Crear 3 publicaciones para el usuario recién creado
        Post::factory()->for($user)->count(3)->create();
    });
}

Resumen y Diferencias Clave

CaracterísticaafterMakingafterCreating
Momento de ejecuciónDespués de crear la instancia, antes de guardar.Después de crear y guardar la instancia en la base de datos.
Estado del modeloLa instancia existe, pero no tiene un id.La instancia existe y tiene un id válido.
Uso principalManipulación de atributos del modelo antes de guardar.Creación de modelos relacionados, lógica que depende de la persistencia.

En resumen, afterMaking es útil para preparar el modelo en memoria, mientras que afterCreating es perfecto para trabajar con el modelo ya persistido en la base de datos, especialmente para establecer relaciones.