Câu trả lời:
bạn có thể tiêm vào lớp của bạn một ví dụ \Magento\Quote\Model\QuoteFactory
.
protected $quoteFactory;
public function __construct(
...
\Magento\Quote\Model\QuoteFactory $quoteFactory,
....
) {
....
$this->quoteFactory = $quoteFactory;
....
}
Sau đó, bạn có thể sử dụng:
$quote = $this->quoteFactory->create()->load($quoteId);
Điều này sẽ hoạt động ngay bây giờ, nhưng sớm thôi, load
phương pháp sẽ biến mất và bạn cần sử dụng hợp đồng dịch vụ.
Vì vậy, bạn có thể sử dụng \Magento\Quote\Api\CartRepositoryInterface
.
Tương tự như trên, thêm một thể hiện của lớp này vào lớp của bạn:
protected $quoteRepository;
public function __construct(
...
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
....
) {
....
$this->quoteRepository = $quoteRepository;
....
}
và sử dụng cái này:
$this->quoteRepository->get($quoteId);
Nếu bạn muốn xem mã trông như thế nào, thì việc thực hiện \Magento\Quote\Api\CartRepositoryInterface
là\Magento\Quote\Model\QuoteRepository
Trước tiên, bạn cần tiêm một hàm tạo \Magento\Quote\Model\QuoteFactory
trong lớp:
protected $_quoteFactory;
public function __construct(
...
\Magento\Quote\Model\QuoteFactory $quoteFactory
) {
$this->_quoteFactory = $quoteFactory;
parent::__construct(...);
}
Sau đó, trong lớp học của bạn, bạn có thể làm:
$this->_quoteFactory->create()->loadByIdWithoutStore($quoteId);
Ngoài ra, bạn cũng có thể sử dụng các phương pháp sau để tải báo giá:
loadActive($quoteId)
nơi nó tải báo giá hoạt động tương ứng (trong đó is_active
= 1)loadByCustomerId($customerId)
nơi nó tải báo giá hoạt động tương ứng với id khách hàng.NB: bạn cũng có thể sử dụng trình quản lý đối tượng trực tiếp để làm điều đó nhưng không được khuyến khích :
$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);
\Magento\Quote\Model\Quote
là một lớp không tiêm. Ý tôi là bạn có thể tiêm nó, nhưng đó không phải là ý tưởng tốt nhất để làm điều đó. Nếu bạn tiêm lớp này vào 2 lớp khác, bạn sẽ nhận được nó dưới dạng đơn lẻ trong thùng chứa DI và nếu bạn gọi load
một lần trong một trong các lớp, bạn cũng sẽ có "lớp" đó trong lớp khác của mình. Hầu hết có lẽ bạn không muốn điều đó. Sử dụng các nhà máy thay thế.
$this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);
bạn có thể sử dụng $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);
Vì lý do tương tự đã nêu ở trên. kêu gọi get
OM sẽ dẫn đến một singleton.
get
vs create
rõ ràng hơn so với việc sử dụng singletons của M1 nhưng tôi vẫn có xu hướng lạm dụng chúng