Ok, donc hier nous avons eu une grosse discussion avec d’autres membres de la communauté Magento concernant l’ utilisation directe de ObjectManager
in classes / modèles .
Je connais déjà les raisons pour lesquelles nous ne devrions pas utiliser directement ObjectManager, citant Alan Kent :
Il y a plusieurs raisons. Le code fonctionnera, mais il est recommandé de ne pas référencer directement la classe ObjectManager.
- Parce que nous le disons! ;-) (mieux exprimé car un code cohérent est un bon code)
- Le code pourrait être utilisé avec un cadre d'injection de dépendance différent à l'avenir
- Le test est plus simple : vous passez des arguments fictifs pour la classe requise sans devoir fournir d'objet fictif.
- Les dépendances restent plus claires - il est évident que le code dépend de la liste de constructeurs, plutôt que d'avoir des dépendances cachées au milieu du code
- Cela encourage les programmeurs à mieux réfléchir aux concepts tels que l'encapsulation et la modularisation - si le constructeur grand, c'est peut-être un signe que le code doit être refactorisé.
D'après ce que j'ai vu dans StackExchange, beaucoup de gens ont tendance à opter pour la solution facile / courte / non recommandée, par exemple quelque chose comme ceci:
<?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);
Au lieu de passer par le processus douloureux mais recommandé de:
- créer un module
- déclarer ses préférences
- injecter des dépendances
- déclarer une méthode publique
Cependant, et voici le dilemme, les fichiers de base de Magento 2 appellent souvent directement ObjectManager . Vous trouverez un exemple rapide ici: https://github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php#L57
Donc, voici mes questions:
- Pourquoi Magento fait-il ce qu'ils nous recommandent de ne pas faire? Cela signifie-t-il qu'il y a des cas où nous devrions utiliser le
ObjectManager
logiciel directement ? Si oui, quels sont ces cas? - Quelles sont les conséquences de l'utilisation directe d'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 [...]
. Cela s'applique également à M2. Consultez également la There are valid use cases
section, qui, là encore, s’applique ici.