Wenn ich glaube, ich habe meinen Kopf um das DI-System von Magento 2 gewickelt, kommt etwas auf und wickelt es ab.
Ich sehe im Kerncode verschiedene Möglichkeiten, auf einen Helfer zuzugreifen.
Zum Beispiel Magento\Catalog\Controller\Category::_initCategory
drin ist dies:
if (!$this->_objectManager->get('Magento\Catalog\Helper\Category')->canShow($category)) {
return false;
}
Aber in Magento\Catalog\Block\Category\View
den Helfer wird in den Konstruktor gespritzt
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Model\Layer\Category $catalogLayer,
\Magento\Framework\Registry $registry,
\Magento\Catalog\Helper\Category $categoryHelper,
array $data = array()
) {
$this->_categoryHelper = $categoryHelper;
$this->_catalogLayer = $catalogLayer;
$this->_coreRegistry = $registry;
parent::__construct($context, $data);
}
Dies führte mich zu der Annahme, dass auf die Helfer in Controllern und Blöcken (und Modellen) unterschiedlich zugegriffen werden sollte, aber dann fand ich einen Controller, in den ein Helfer in den Konstruktor injiziert wird Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute
.
Bitte klären Sie den Nebel für mich.
Wann sollte ich DI verwenden und wann sollte ich verwenden objectManager
? und warum?
Ich habe diese Frage gelesen: Helfer in Magento 2 instanziieren . Dies ist nur eine Folgefrage dazu.
quelle
Ich weiß nicht so viel über die Magento-Implementierung, aber es sieht so aus, als wäre
ObjectManager
es ein Service Locator .Im Allgemeinen ist die Verwendung eines Service Locator für den Zugriff auf Abhängigkeiten in einem Objekt ziemlich schlecht. Lesen Sie diesen Artikel .
Das explizite Definieren Ihrer Abhängigkeiten durch einen Konstruktor ist ein viel besserer Ansatz. Es hilft bei Unit-Tests und Laufzeitproblemen, wenn Services nicht definiert sind.
Wenn Sie den Objektmanager in eine Klasse einfügen, wird Ihrer Klasse im Grunde genommen eine Registrierung hinzugefügt, die Zugriff auf alle Ihre Anwendungsdienste hat, was offensichtlich nicht richtig ist.
Ich benutze ZF2 ein gutes Stück und definiere im Allgemeinen kleine Factory-Klassen für Services, Controller und jede Klasse, die Abhängigkeiten erfordert. Diese Factory-Klassen haben Zugriff auf den Service Locator und greifen auf alle Services zu, von denen das Objekt abhängt, und fügen sie über den Konstruktor ein. Einen Service Locator in einer Fabrik - Klasse ist in Ordnung , da es meist Code wegzuwerfen ist, so etwas wie dies zum Beispiel.
Diese Fabriken sind immer noch leicht zu testen .
IMO, Verwenden Sie nach Möglichkeit eine Konstruktorinjektion. Auch hier weiß ich nicht viel über die Implementierung von Magento und wenn es das Konzept von Fabriken hat, sieht es auf den ersten Blick so aus, als würde es sie unterstützen, aber es ist explizit, Ihre Klassen zu definieren und einen Service Locator zu verwenden, um sie in Factory-Klassen zu erstellen ein viel sauberer Ansatz.
Dies ist von jemandem, der nur begrenzt mit den oben genannten Mustern in Berührung gekommen ist, daher würde ich auch gerne die Gedanken / Erfahrungen anderer zu diesem Thema hören!
Mehr lesen
quelle
Eine andere Möglichkeit, den Helfer (in Vorlagen) zu verwenden, ist:
Ich hoffe, es ist nützlich, wenn Sie es noch nicht wussten.
quelle
Obwohl es eine alte Frage ist, bin ich mir nicht sicher, ob Marius ihre Antwort bekommen hat. Ich glaube, Marius kann es besser beantworten. Ich möchte es kurz beantworten. Warum schlägt Magento 2 vor, DI anstelle von Helfer zu verwenden?
Warum verwendet der M2-Kern in einigen Fällen möglicherweise kein DI?
Obwohl das Core-Katalogmodul als Helfer verwendet wurde, wurde DI ausgiebig verwendet. Bei meinen Recherchen stellte ich fest, dass Magento 2 nur wenige Funktionen in Core Catalog-Hilfsdateien verwendet, die nicht für Serviceverträge geeignet sind.
Wenn Sie explizit eine von Magento definierte Klasse verwenden müssen (z. B. \ Magento \ Catalog \ Model \ Product), machen Sie die implizite Abhängigkeit explizit, indem Sie von der konkreten Implementierung anstelle der Servicevertragsschnittstelle abhängen.
Zweifellos sollte der Erweiterungsentwickler DI anstelle von Magento1 wie Helper verwenden. Bei der Implementierung gemäß den Richtlinien von Magento 2 ist der Fallout begrenzt. Wenn Sie gegen Empfehlungen verstoßen, treten Probleme auf.
quelle