Ich verstehe, dass die bevorzugte Art, in Magento 2 zwischen Modulen zu arbeiten, die Verwendung von Serviceverträgen ist.
Wenn ich also ein Produkt laden möchte, verwende ich das Produkt-Repository:
$product = $productRepository->getById($id);
Das ist vertraglich die Rückgabe einer Instanz von Magento\Catalog\Api\Data\ProductInterface
.
Aber ich könnte stattdessen auch den alten Weg verwenden und die Domain-Ebene direkt aufrufen:
$product = $productFactory->create()->load($id);
Gibt es einen Fall, in dem dies notwendig oder nützlich wäre?
Die Devdocs sagen (Highlight hinzugefügt):
Ein Modul kann direkt in ein anderes Modul aufrufen. Diese eng gekoppelte Lösung wird für die meisten Situationen nicht empfohlen, ist jedoch manchmal unvermeidlich .
[...]
Ihre Strategie zum Aufrufen des Domain-Layer-Codes eines anderen Moduls hängt stark von der Konfiguration und den Anforderungen Ihres Systems ab.
Quelle: http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html
Und ein Kommentar zu einer verwandten Frage lautete:
das Repository verwenden werden Sie ein Produktdatenmodell (
Api/Data/Product
), die ein Produktmodell ist in eine abgespeckte DTO umgewandelt. Etwas zu beachten, da sie ganz anders sind
Aber soweit ich sehe, sind die Objekte unter normalen Bedingungen die gleichen, nur die Rückgabetypen pro phpDoc unterscheiden sich ( Magento\Catalog\Api\Data\ProductInterface
/ Magento\Catalog\Model\Product
)
quelle
But I could also use the old way instead, calling the domain layer directly: (use factory). Is there any case where this would be necessary or useful?
. Ja, wenn Sie die Methode eines Modells aufrufen müssen und nicht die eines ModellsApi/Data/Product
. Ist das besser? :)Für mich gibt es keinen Grund, die
load
Methode über diegetById
/ zu verwendenget
-Methode zu verwenden.Ich sage nicht, dass ich recht habe, aber so sehe ich die Dinge.
Ok, hier ist die
getById
Methode (dieget
Methode ist ähnlich, verwendet aber die SKU anstelle der ID):Wie Sie sehen können, haben Sie folgenden Code eingefügt:
Ist Teil dieser Funktion.
Die zusätzliche Bedingung verwendet jedoch zwischengespeicherte Instanzen, um ein zusätzliches Neuladen zu vermeiden, falls Sie zuvor die
getById
oder dieget
Methode für dieselbe ID verwendet haben (oder sku bei derget
Methode) .Möglicherweise besteht ein guter Grund für die Verwendung
load
darin, die Verwendung dieser zwischengespeicherten Instanzen zu vermeiden (in diesem Fall kann dies ein guter Grund sein, den ich nicht kenne), abergetById
dieget
Methoden und haben einen$forceReload
Parameter, der auf true gesetzt werden kann Vermeiden Sie die Verwendung dieser Cache-Instanzen.Deshalb gibt es für mich keinen guten Grund,
load
method overgetById
oderget
methods zu verwenden.quelle
Bitte verstehen Sie den Unterschied zwischen Repositorys und Sammlungen.
Wenn Sie in Ihrem Beispiel Repositorys verwenden, erhalten Sie ein Array
Magento\Catalog\Api\Data\ProductInterface
, das sich vom Abrufen einer Auflistung von unterscheidetMagento\Catalog\Model\Product
.Repositorys und Datenschnittstellen bieten Ihnen ein hohes Schnittstellenlevel, das in zukünftigen Releases als kompatibel garantiert werden sollte . Deshalb ist es der vorgeschlagene Ansatz.
Ich hoffe es hilft.
quelle