Ответы:
Вы можете добавить в свой класс экземпляр \Magento\Quote\Model\QuoteFactory
.
protected $quoteFactory;
public function __construct(
...
\Magento\Quote\Model\QuoteFactory $quoteFactory,
....
) {
....
$this->quoteFactory = $quoteFactory;
....
}
Тогда вы можете использовать:
$quote = $this->quoteFactory->create()->load($quoteId);
Пока это должно работать, но скоро load
метод уйдет, и вам нужно будет заключить договор на обслуживание.
Так что вы можете использовать \Magento\Quote\Api\CartRepositoryInterface
.
То же, что и выше, добавить экземпляр этого класса в ваш класс:
protected $quoteRepository;
public function __construct(
...
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
....
) {
....
$this->quoteRepository = $quoteRepository;
....
}
и используйте это:
$this->quoteRepository->get($quoteId);
Если вы хотите увидеть , как выглядит код, реализация для \Magento\Quote\Api\CartRepositoryInterface
IS\Magento\Quote\Model\QuoteRepository
Сначала вам нужно добавить \Magento\Quote\Model\QuoteFactory
в конструктор вашего класса:
protected $_quoteFactory;
public function __construct(
...
\Magento\Quote\Model\QuoteFactory $quoteFactory
) {
$this->_quoteFactory = $quoteFactory;
parent::__construct(...);
}
Тогда в вашем классе вы можете сделать:
$this->_quoteFactory->create()->loadByIdWithoutStore($quoteId);
Кроме того, вы можете использовать следующие методы для загрузки цитаты:
loadActive($quoteId)
куда он загружает соответствующую активную цитату (где is_active
= 1)loadByCustomerId($customerId)
где он загружает активную квоту, соответствующую идентификатору клиента.NB: вы также можете напрямую использовать диспетчер объектов, но это не рекомендуется :
$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);
\Magento\Quote\Model\Quote
это неинъекционный класс. Я имею в виду, что вы можете сделать это, но это не лучшая идея. Если вы внедрите этот класс в 2 других класса, вы получите его как одиночный объект в контейнере DI, и если вы вызовете load
один раз в одном из классов, он будет «загружен» и в ваш другой класс. Скорее всего, вы этого не хотите. Вместо этого используйте фабрики.
$this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);
вы можете использовать по $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);
той же причине, указанной выше. вызов get
ОМ приведет к одиночке.
get
против create
более очевидна, чем использование синглетонов M1, но я все еще склонен злоупотреблять ими