Ответы:
Вы можете добавить в свой класс экземпляр \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\CartRepositoryInterfaceIS\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, но я все еще склонен злоупотреблять ими