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 load
Methode 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\CartRepositoryInterface
lautet die Implementierung für\Magento\Quote\Model\QuoteRepository
Zuerst müssen Sie ein \Magento\Quote\Model\QuoteFactory
in 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\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 sie load
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 Aufrufen get
des OM führt zu einem Singleton.
get
vs create
offensichtlicher ist als die Verwendung von Singletons von M1, aber ich neige immer noch dazu, sie zu missbrauchen