Skip to main content

Cosa sono le factory

Nei test e nel seeding del database devi inserire record. Anziché indicare manualmente il valore di ogni colonna, con le factory dei modelli di Laravel puoi definire un set di attributi predefiniti per ciascun modello Eloquent. Ogni nuova applicazione Laravel include già database/factories/UserFactory.php.
Tramite l’helper fake() puoi usare la libreria Faker, che genera vari dati casuali.
Puoi cambiare la localizzazione di Faker con l’opzione faker_locale in config/app.php.

Creazione di una factory

Crea una factory con il comando Artisan make:factory.
La nuova classe factory viene collocata in database/factories.

Rilevamento automatico modello-factory

Se usi il trait HasFactory sul modello, Laravel trova automaticamente la factory corrispondente. Cerca nel namespace Database\Factories una classe il cui nome è quello del modello con Factory in coda. Se la convenzione di naming non è rispettata, puoi indicarla esplicitamente con l’attributo UseFactory.

Definizione di una factory

Metodo definition()

Nel cuore della factory, definition(), definisci gli attributi predefiniti.
Metodi Faker molto usati:

Stati della factory (States)

Con i metodi di stato puoi definire varianti specifiche di una factory.
Gli stati sono componibili.

Stato soft delete

Per modelli con soft delete è disponibile lo stato integrato trashed().

Callback della factory

Con afterMaking e afterCreating puoi definire logiche dopo la creazione del modello.
Puoi registrare callback anche dentro i metodi di stato.

Generazione dei modelli

make() — senza salvare nel DB

create() — salva nel DB

Sovrascrittura degli attributi

Passando un array a make() o create() sovrascrivi attributi specifici.
Puoi anche fare una sovrascrittura inline tramite state.
Quando generi modelli con le factory, la protezione da mass assignment viene disabilitata automaticamente.

Sequence

Se durante la generazione di più modelli vuoi alternare gli attributi, usa Sequence.
Il metodo sequence() è più conciso.
Puoi generare valori dinamici casuali con una closure.

Factory con relazioni

Has Many (1-a-molti)

Con has() generi un modello che possiede una relazione “1-a-molti”.
Con i magic method scrivi in modo più conciso (has + plurale del nome della relazione).

Belongs To (relazione inversa)

Con for() indichi il modello padre a cui appartiene.
Versione con magic method:

Many to Many (molti-a-molti)

Con hasAttached() gestisci relazioni molti-a-molti. Puoi indicare anche gli attributi della tabella pivot.
Versione con magic method:

Relazioni polimorfiche

Come per il normale 1-a-molti, puoi usare has() o i magic method.
Per la relazione morphTo i magic method non sono disponibili. Indica la relazione in for().

Relazioni definite dentro la factory

Se in definition() assegni un’altra factory a una chiave esterna, durante la creazione del modello viene generato automaticamente anche il modello padre.

recycle() — riutilizzo di modelli esistenti

Se vuoi riutilizzare la stessa istanza per più relazioni, usa recycle().

Uso nel seeding

Chiama le factory da DatabaseSeeder o dai tuoi seeder.
Esecuzione del seeder:

Uso nei test

Nei test, combina le factory con il trait RefreshDatabase.
RefreshDatabase resetta il database per ogni test, così i test non interferiscono tra loro.
In Pest l’API delle factory è la stessa. Usa uses(RefreshDatabase::class) per resettare il database.

Prossimi passi

Database seeding

Combina seeder e factory per inserire dati iniziali.

Introduzione al testing

Le funzionalità di test di Laravel e il trait RefreshDatabase.
Ultima modifica il 13 luglio 2026