Cosa innesca la generazione di una fabbrica in Magento 2


39

Magento 2 contiene numerosi file di classe pre-generati o generati al volo. Loro vivono in

var/generated

Questi file generati includono le classi di fabbrica. Dalla documentazione , ho capito che un programmatore utilizza le classi di fabbrica per istanziare oggetti "non iniettabili". Un oggetto "non iniettabile" è un oggetto che non può essere aggiunto tramite l' __constructoriniezione di dipendenza, di solito perché richiede l'input dell'utente per istanziare.

Ciò che non è chiaro dalla documentazione è come Magento 2 sappia che deve generare una classe di fabbrica. Questo bit

Se viene rilevato un factory inesistente dal gestore oggetti in modalità runtime o compilatore, il gestore oggetti genera il factory.

sembra che se uso una classe factory nel gestore degli oggetti (o, per estensione, nell'iniezione di dipendenza __costructors), Magento 2 lo genererà per me. Ma come fa il gestore degli oggetti a sapere che la cosa che sto richiedendo è una fabbrica?

Inoltre, sembrano esserci due comandi per generare automaticamente (o "compilare") tutte le classi generate. L'esecuzione di uno di questi comandi genera un gran numero di classi Factory. Quali file di configurazione e / o di codice vengono visualizzati da questi comandi per generare gli oggetti factory necessari?

So che rintracciare il gestore degli oggetti e / o il codice comando fino in fondo lo rivelerebbe, ma spero di evitare quel lungo e arduo viaggio.

Risposte:


21

Qualche posizione di codice interessante per come tutto questo funziona insieme: https://github.com/magento/magento2/blob/develop/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php#L40

Con i diversi tipi provenienti principalmente da qui https://github.com/magento/magento2/tree/develop/lib/internal/Magento/Framework/ObjectManager/Code/Generator ma anche da qui https://github.com/magento / magento2 / tree / develop / lib / internal / Magento / Framework / Interception / Code / Generator per il codice di intercettazione.

È tutto attivato dal caricatore automatico qui https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Code/Generator/Autoloader.php#L32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

Non ho trovato nel codice, le condizioni per le quali vengono generate le fabbriche, ma dalla mia comprensione viene generata una classe di fabbrica quando viene richiesta e non trovata.
Ci sono alcune parole chiave riservate Factory, Proxy, Interceptor, se utilizzate, attiveranno la generazione di codice quando non vengono trovate le classi specifiche.
Riprenderò non appena trovo il codice che attiva la generazione della fabbrica.
Quindi, se richiedi la classe Some\Namespace\HereFactorye la classe non esiste, poiché termina con la parola chiave Factoryverrà generata invar/generation/Some/Namespace/HereFactory.php


Sembra che i documenti debbano essere aggiornati poiché ObjectManager non è proprio quello che genera. Il caricatore automatico speciale fa parte della risposta. github.com/magento/magento2/blob/develop/lib/internal/Magento/…
Chris O'Toole

1
Ciò è in linea con la mia esperienza (vedi gist.github.com/astorm/f245ce9c761c9a8053aa), ma solleva la domanda 1. Dove succede nel codice del gestore oggetti (ovvero qual è la convenzione effettiva) 2. Come funziona il compilatore / il generatore sa quali fabbriche generare?
Alan Storm

8

Sto scavando in questa stessa zuppa di piselli proprio ora. La mia comprensione finora è che tutto ciò che viene generato automaticamente /var/generationviene fatto dalle preferenze e dalle interfacce dichiarate in app/etc/di.xml.

Le interfacce e le preferenze del tuo verranno dichiarate nel di.xmlfile nel tuo /app/code/Vendor/<module>/etc/di.xml.

Sa generare gli oggetti perché hai dichiarato un'interfaccia nel tuo __constructor AND e hai dichiarato una preferenza per quell'interfaccia o globalmente o localmente nel di.xmlfile appropriato .

Offro tre chicchi di sale con i miei commenti.


+1 per le informazioni utili - ma sembra che le Fabbriche provengano da un posto diverso dai di.xmlfile - puoi inviare qualcosa nel gestore degli oggetti che termina in Factory e genererà un file per te.
Alan Storm,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.