Ok, quindi ieri abbiamo avuto un grande colloquio con altre persone della comunità Magento sull'uso diretto delle ObjectManager
classi / template in .
Sono già a conoscenza dei motivi per cui non dovremmo usare direttamente l'ObjectManager, citando Alan Kent :
Ci sono diverse ragioni. Il codice funzionerà, ma è consigliabile non fare riferimento direttamente alla classe ObjectManager.
- Perché lo diciamo noi! ;-) (meglio espresso come codice coerente è un buon codice)
- Il codice potrebbe essere utilizzato in futuro con un framework di iniezione delle dipendenze diverso
- Il test è più semplice : passi argomenti falsi per la classe richiesta, senza dover fornire un ObjectManager fittizio
- Mantiene le dipendenze più chiare - è ovvio da cosa dipende il codice tramite l'elenco dei costruttori, piuttosto che avere dipendenze nascoste nel mezzo del codice
- Incoraggia i programmatori a pensare meglio a concetti come l'incapsulamento e la modularizzazione : se il costruttore diventa grande, forse è un segno che il codice deve essere sottoposto a refactoring
Da quello che ho visto in StackExchange, molte persone tendono ad optare per la soluzione facile / breve / non raccomandata, ad esempio qualcosa del genere:
<?php
//Get Object Manager Instance
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
//Load product by product id
$product = $objectManager->create('Magento\Catalog\Model\Product')->load($id);
Invece di passare attraverso il processo doloroso ma raccomandato di:
- creando un modulo
- dichiarando le preferenze
- iniettare dipendenze
- dichiarare un metodo pubblico
Tuttavia, e qui arriva il dilemma, i file core di Magento 2 spesso chiamano direttamente l'ObjectManager . Un rapido esempio può essere trovato qui: https://github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php#L57
Quindi, ecco le mie domande:
- Perché Magento sta facendo ciò che ci consigliano di non fare? Ciò significa che ci sono alcuni casi in cui dovremmo usare
ObjectManager
direttamente ? In tal caso, quali sono questi casi? - Quali sono le conseguenze dell'utilizzo diretto dell'ObjectManager ?
The intent of zend-servicemanager is for use as an Inversion of Control container. It was never intended as a general purpose service locator [...]
. Che si applica anche a M2. Controlla anche la There are valid use cases
sezione, che, di nuovo, si applica anche qui.