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.
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 Artisanmake:factory.
database/factories.
Rilevamento automatico modello-factory
Se usi il traitHasFactory 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.
Stati della factory (States)
Con i metodi di stato puoi definire varianti specifiche di una factory.Stato soft delete
Per modelli con soft delete è disponibile lo stato integratotrashed().
Callback della factory
ConafterMaking e afterCreating puoi definire logiche dopo la creazione del modello.
Generazione dei modelli
make() — senza salvare nel DB
create() — salva nel DB
Sovrascrittura degli attributi
Passando un array amake() o create() sovrascrivi attributi specifici.
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, usaSequence.
sequence() è più conciso.
Factory con relazioni
Has Many (1-a-molti)
Conhas() generi un modello che possiede una relazione “1-a-molti”.
has + plurale del nome della relazione).
Belongs To (relazione inversa)
Confor() indichi il modello padre a cui appartiene.
Many to Many (molti-a-molti)
ConhasAttached() gestisci relazioni molti-a-molti. Puoi indicare anche gli attributi della tabella pivot.
Relazioni polimorfiche
Come per il normale 1-a-molti, puoi usarehas() o i magic method.
morphTo i magic method non sono disponibili. Indica la relazione in for().
Relazioni definite dentro la factory
Se indefinition() 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, usarecycle().
Uso nel seeding
Chiama le factory daDatabaseSeeder o dai tuoi seeder.
Uso nei test
Nei test, combina le factory con il traitRefreshDatabase.
RefreshDatabase resetta il database per ogni test, così i test non interferiscono tra loro.
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.