Dies sollte vorerst funktionieren, aber bald wird die loadMethode verschwinden und Sie müssen einen Servicevertrag verwenden.
So können Sie verwenden \Magento\Quote\Api\CartRepositoryInterface.
Fügen Sie wie oben eine Instanz dieser Klasse in Ihre Klasse ein:
Wenn Sie sehen möchten, wie der Code aussieht, \Magento\Quote\Api\CartRepositoryInterfacelautet die Implementierung für\Magento\Quote\Model\QuoteRepository
\Magento\Quote\Model\Quoteist eine nicht injizierbare Klasse. Ich meine, Sie können es injizieren, aber es ist nicht die beste Idee, dies zu tun. Wenn Sie diese Klasse in zwei andere Klassen einfügen, erhalten Sie sie als Singleton im DI-Container. Wenn Sie sie loadeinmal in einer der Klassen aufrufen , wird sie auch in Ihrer anderen Klasse "geladen". Höchstwahrscheinlich willst du das nicht. Verwenden Sie stattdessen Fabriken.
Marius
@Marius Folgendes passiert, wenn Sie gleichzeitig an M1- und M2-Projekten arbeiten. Sie neigen dazu, alles zu verwechseln. Vielen Dank für das Enlight und +1 für Ihre Lösung, definitiv der richtige Weg für Serviceverträge
Raphael bei Digital Pianism
Anstelle von $this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);können $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);Sie aus dem gleichen Grund wie oben angegeben verwenden. Das Aufrufen getdes OM führt zu einem Singleton.
Marius
@Marius Ich finde, dass getvs createoffensichtlicher ist als die Verwendung von Singletons von M1, aber ich neige immer noch dazu, sie zu missbrauchen
Zuerst müssen Sie ein
\Magento\Quote\Model\QuoteFactory
in Ihren Klassenkonstruktor einfügen:Dann können Sie in Ihrer Klasse Folgendes tun:
Nebenbei bemerkt können Sie auch die folgenden Methoden verwenden, um ein Angebot zu laden:
loadActive($quoteId)
wo es das entsprechende aktive Anführungszeichen lädt (wobeiis_active
= 1)loadByCustomerId($customerId)
Dort wird das aktive Angebot geladen, das der Kunden-ID entspricht.NB: Sie können den Objektmanager auch direkt verwenden, dies wird jedoch nicht empfohlen :
quelle
\Magento\Quote\Model\Quote
ist eine nicht injizierbare Klasse. Ich meine, Sie können es injizieren, aber es ist nicht die beste Idee, dies zu tun. Wenn Sie diese Klasse in zwei andere Klassen einfügen, erhalten Sie sie als Singleton im DI-Container. Wenn Sie sieload
einmal in einer der Klassen aufrufen , wird sie auch in Ihrer anderen Klasse "geladen". Höchstwahrscheinlich willst du das nicht. Verwenden Sie stattdessen Fabriken.$this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);
können$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);
Sie aus dem gleichen Grund wie oben angegeben verwenden. Das Aufrufenget
des OM führt zu einem Singleton.get
vscreate
offensichtlicher ist als die Verwendung von Singletons von M1, aber ich neige immer noch dazu, sie zu missbrauchen