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.
// 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.
// 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ística | afterMaking | afterCreating |
Momento de ejecución | Después de crear la instancia, antes de guardar. | Después de crear y guardar la instancia en la base de datos. |
Estado del modelo | La instancia existe, pero no tiene un id . | La instancia existe y tiene un id válido. |
Uso principal | Manipulació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.