Ok, also gestern hatten wir ein großes Gespräch mit anderen Leuten aus der Magento-Community über die direkte Verwendung der ObjectManager
in Klassen / Vorlagen .
Ich kenne bereits die Gründe, warum wir den ObjectManager nicht direkt verwenden sollten, unter Berufung auf Alan Kent :
Es gibt verschiedene Gründe. Der Code funktioniert, es wird jedoch empfohlen, die ObjectManager-Klasse nicht direkt zu referenzieren.
- Weil wir es so sagen! ;-) (besser ausgedrückt als konsistenter Code ist guter Code)
- Der Code könnte in Zukunft mit einem anderen Abhängigkeitsinjektionsframework verwendet werden
- Das Testen ist einfacher - Sie übergeben Scheinargumente für die erforderliche Klasse, ohne einen Schein-ObjectManager bereitstellen zu müssen
- Abhängigkeiten bleiben klarer - es ist offensichtlich, wovon der Code über die Konstruktorliste abhängt, anstatt Abhängigkeiten in der Mitte des Codes zu verbergen
- Es ermutigt Programmierer, Konzepte wie Kapselung und Modularisierung besser zu überdenken - wenn der Konstruktor groß wird, ist es vielleicht ein Zeichen, dass der Code überarbeitet werden muss
Nach dem, was ich in StackExchange gesehen habe, entscheiden sich viele Leute für die einfache / kurze / nicht empfohlene Lösung, zum Beispiel für Folgendes:
<?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);
Anstatt den schmerzhaften, aber empfohlenen Prozess zu durchlaufen :
- Erstellen eines Moduls
- Präferenzen angeben
- Abhängigkeiten einschleusen
- Deklarieren Sie eine öffentliche Methode
Und hier kommt das Dilemma, dass Magento 2-Kerndateien den ObjectManager oft direkt aufrufen . Ein kurzes Beispiel finden Sie hier: https://github.com/magento/magento2/blob/develop/app/code/Magento/GoogleOptimizer/Block/Adminhtml/Form.php#L57
Also hier sind meine Fragen:
- Warum macht Magento das, wovon sie uns raten? Heißt das, es gibt einige Fälle, in denen wir die
ObjectManager
direkt verwenden sollten ? Wenn ja, wie lauten diese Fälle? - Welche Konsequenzen hat die direkte Verwendung des ObjectManagers ?
The intent of zend-servicemanager is for use as an Inversion of Control container. It was never intended as a general purpose service locator [...]
. Das gilt auch für M2. Überprüfen Sie auch den There are valid use cases
Abschnitt, der auch hier gilt.