Tôi đã vấp phải vấn đề này một lần nữa ngày hôm nay và điều quan trọng là phải biết rằng vấn đề này được đưa ra bất cứ khi nào một sự phụ thuộc xuống chuỗi khởi tạo một thể hiện cần biết trạng thái của ứng dụng.
Trong nhiều trường hợp, lỗi này bị ràng buộc theo phiên (vì phiên cần biết trạng thái của ứng dụng (frontend hoặc adminhtml)).
Trong trường hợp của tôi, tôi cần phải có Magento\Tax\Api\TaxCalculationInterface
một lệnh CLI, nhưng điều này đòi hỏi tại một số điểm trong chuỗi phụ thuộc đó là phiên khách hàng (có thể để có được nhóm khách hàng).
Chỉnh sửa: Tôi tìm thấy một giải pháp tốt hơn bằng cách sử dụng proxy. Nhưng vì lợi ích của lịch sử, đây là câu trả lời trước đây của tôi:
Để giải quyết vấn đề này, tôi đã không đưa giao diện này vào công cụ xây dựng của mình, mà là nhà máy của nó:
/**
* @var \Magento\Tax\Api\TaxCalculationInterfaceFactory
*/
protected $taxCalculationFactory;
/**
* @param \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
) {
$this->taxCalculationFactory = $taxCalculationFactory;
}
Theo cách này, lớp chỉ được khởi tạo trong một phương thức mà tôi cần nó và không còn trong hàm tạo:
$taxCalculation = $this->taxCalculationFactory->create();
Điều này đã giải quyết vấn đề cho tôi trong trường hợp cụ thể này.
Và bây giờ câu trả lời bằng proxy:
Nếu bạn không muốn kích hoạt tất cả các phụ thuộc trong chuỗi, bạn nên sử dụng proxy trong hàm tạo của mình. Theo tài liệu gốc :
... tiêm constructor cũng có nghĩa là một phản ứng dây chuyền khởi tạo đối tượng thường là kết quả khi bạn tạo một đối tượng.
và:
... Proxy mở rộng các lớp khác để trở thành phiên bản lười biếng của chúng. Đó là, một thể hiện thực của lớp mà một proxy mở rộng chỉ được tạo sau khi một trong các phương thức của lớp thực sự được gọi.
Vì vậy, trong tình huống của tôi, với TaxCalculationInterface
tất cả, tất cả những gì tôi phải làm là khởi tạo tính toán thuế của mình dưới dạng proxy trong công cụ xây dựng của mình:
/**
* @var \Magento\Tax\Api\TaxCalculationInterface\Proxy
*/
protected $taxCalculation;
/**
* @param \Magento\Tax\Api\TaxCalculationInterface\Proxy $taxCalculation
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterface\Proxy $taxCalculation
) {
$this->taxCalculation = $taxCalculation;
}
Bằng cách này, lớp học của tôi là lười tải. Đó là: nó chỉ được khởi tạo ngay khi tôi gọi một trong các phương thức của nó. Ví dụ:
$rate = $this->taxCalculation->getCalculatedRate($productRateId);