Antworten:
Sie können in Ihre Klasse eine Instanz von injizieren \Magento\Quote\Model\QuoteFactory.
protected $quoteFactory;
public function __construct(
...
\Magento\Quote\Model\QuoteFactory $quoteFactory,
....
) {
....
$this->quoteFactory = $quoteFactory;
....
}
Dann können Sie verwenden:
$quote = $this->quoteFactory->create()->load($quoteId);
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:
protected $quoteRepository;
public function __construct(
...
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
....
) {
....
$this->quoteRepository = $quoteRepository;
....
}
und benutze dies:
$this->quoteRepository->get($quoteId);
Wenn Sie sehen möchten, wie der Code aussieht, \Magento\Quote\Api\CartRepositoryInterfacelautet die Implementierung für\Magento\Quote\Model\QuoteRepository
Zuerst müssen Sie ein \Magento\Quote\Model\QuoteFactoryin Ihren Klassenkonstruktor einfügen:
protected $_quoteFactory;
public function __construct(
...
\Magento\Quote\Model\QuoteFactory $quoteFactory
) {
$this->_quoteFactory = $quoteFactory;
parent::__construct(...);
}
Dann können Sie in Ihrer Klasse Folgendes tun:
$this->_quoteFactory->create()->loadByIdWithoutStore($quoteId);
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 (wobei is_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 :
$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);
\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.
$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.
getvs createoffensichtlicher ist als die Verwendung von Singletons von M1, aber ich neige immer noch dazu, sie zu missbrauchen