Ir al contenido principal

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.

Comentarios

Entradas populares de este blog

Crear proyecto de frontend con Vite, React, Tailwind, Typescript y JSX

 ¿Cómo se crea un proyecto exclusivo de frontend con Vite, React, Tailwind, Typescript y JSX? ¡Absolutamente! Entiendo que quieres la guía completa para pasar de cero a tener un proyecto de frontend moderno, vacío y listo para ser llenado con tu código. A continuación, te proporciono un archivo de guía detallada que incluye todos los comandos necesarios para inicializar el proyecto, configurar Tailwind CSS, y los pasos clave para empezar a "poblarlo". Voy a generar un documento Markdown con la guía paso a paso, incluyendo los comandos de terminal y las modificaciones esenciales a los archivos de configuración. Guía: Creación de un Proyecto Frontend Puro (Vite, React, TypeScript, Tailwind) Este documento detalla el proceso para inicializar un proyecto de frontend vacío y optimizado, utilizando Vite como empaquetador, React como librería, TypeScript para tipado y Tailwind CSS para estilizado. 1. Inicialización del Proyecto con Vite Vite es la herramienta más rápida para emp...

Tokens V2

Tokens: Programme to discover tokens, where there are not. Now available at  https://puszcza.gnu.org.ua/projects/tokens/ This is Version 2, for  version 1, go here . Synopsis: use TokensV2; sub printFile; my @FORMAT = ( ['<Message Date=".*?" Time=".*?" DateTime=".*?" SessionID=".*?"><From>(?:<User FriendlyName=".*?"/>)+</From><To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style=".*?")?>.*?</Text></Message>',   sub {     my $fh = $_[1];     my ($d, $t, $f, $s, $T) = $_[0] =~ m|<Message Date="(.*?)" Time="(.*?)" DateTime=".*?" SessionID=".*?">(<From>(?:<User FriendlyName=".*?"/>)+</From>)<To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style="(.*?)")?>(.*?)</Text></Message>|;     my $F = join '<br />', ...

Perl Net::LDAP::SimpleServer

Adaptaciones sobre el módulo LDAP Server para Windows (Strawberry Perl) Lista de adaptaciones (continúa más abajo): - Relajación de condiciones de bind:     - Cuenta principal (principal account)     - Validación de contraseñas Ubicación del archivo: %Strawberry_Perl%\site\lib\net\ldap\SimpleServer\ProtocolHandler.pm CPAN: http://search.cpan.org/~russoz/Net-LDAP-SimpleServer-0.0.17/lib/Net/LDAP/SimpleServer.pm Código: package Net::LDAP::SimpleServer::ProtocolHandler; use strict; use warnings; # ABSTRACT: LDAP protocol handler used with Net::LDAP::SimpleServer our $VERSION = '0.0.17';    # VERSION use Net::LDAP::Server; use base 'Net::LDAP::Server'; use fields qw(store root_dn root_pw allow_anon); use Carp; use Net::LDAP::LDIF; use Net::LDAP::Util qw{canonical_dn}; use Net::LDAP::FilterMatch; use Net::LDAP::Constant (     qw/LDAP_SUCCESS LDAP_AUTH_UNKNOWN LDAP_INVALID_CREDENTIALS/,   ...