Respuestas:
puedes inyectar en tu clase una instancia de \Magento\Quote\Model\QuoteFactory
.
protected $quoteFactory;
public function __construct(
...
\Magento\Quote\Model\QuoteFactory $quoteFactory,
....
) {
....
$this->quoteFactory = $quoteFactory;
....
}
Entonces puedes usar:
$quote = $this->quoteFactory->create()->load($quoteId);
Esto debería funcionar por ahora, pero pronto, el load
método desaparecerá y deberá usar un contrato de servicio.
Entonces puedes usar \Magento\Quote\Api\CartRepositoryInterface
.
Igual que el anterior, inyecte una instancia de esta clase en su clase:
protected $quoteRepository;
public function __construct(
...
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
....
) {
....
$this->quoteRepository = $quoteRepository;
....
}
y usa esto:
$this->quoteRepository->get($quoteId);
Si desea ver cómo se ve el código, la implementación \Magento\Quote\Api\CartRepositoryInterface
es\Magento\Quote\Model\QuoteRepository
Primero debes inyectar un \Magento\Quote\Model\QuoteFactory
en el constructor de tu clase:
protected $_quoteFactory;
public function __construct(
...
\Magento\Quote\Model\QuoteFactory $quoteFactory
) {
$this->_quoteFactory = $quoteFactory;
parent::__construct(...);
}
Luego en tu clase puedes hacer:
$this->_quoteFactory->create()->loadByIdWithoutStore($quoteId);
En una nota al margen, también puede usar los siguientes métodos para cargar una cotización:
loadActive($quoteId)
donde carga la cotización activa correspondiente (donde is_active
= 1)loadByCustomerId($customerId)
donde carga la cotización activa correspondiente a la identificación del cliente.NB: también puede usar el administrador de objetos directamente para hacerlo, pero no se recomienda :
$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);
\Magento\Quote\Model\Quote
Es una clase no inyectable. Quiero decir que puedes inyectarlo, pero no es la mejor idea hacerlo. Si inyecta esta clase en otras 2 clases, la obtendrá como un singleton en el contenedor DI y si llama load
una vez en una de las clases, también la tendrá "cargada" en su otra clase. Lo más probable es que no quieras eso. Use fábricas en su lugar.
$this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);
usted puede usarlo $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);
por la misma razón indicada anteriormente. llamar get
al OM dará como resultado un singleton.
get
vs create
es más obvio que el uso de singletons de M1, pero todavía tiendo a usarlos mal