Bugün yine bu soruna rastladım ve bu sorunun, zincirdeki bir bağımlılık, uygulamanın durumunu bilmesi gereken bir örneği başlattığı zaman atıldığını bilmek önemlidir.
Çoğu durumda bu hata oturuma bağlıdır (oturumun uygulamanın durumunu bilmesi gerektiğinden (frontend veya adminhtml)).
Benim durumumda Magento\Tax\Api\TaxCalculationInterface
bir CLI komutuna ihtiyacım vardı, ancak bu bir noktada müşteri oturumunun bağımlılık zincirinde (muhtemelen müşteri grubunu elde etmek için) ihtiyaç duyuyor.
Düzenleme: Proxy'ler kullanarak daha iyi bir çözüm buldum. Ama tarihin iyiliği için önceki cevabım:
Bunu çözmek için yapıcıma bu arayüzü dahil etmedim, aksine fabrika:
/**
* @var \Magento\Tax\Api\TaxCalculationInterfaceFactory
*/
protected $taxCalculationFactory;
/**
* @param \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
) {
$this->taxCalculationFactory = $taxCalculationFactory;
}
Bu şekilde, sınıf sadece ihtiyacım olan bir yöntemde somutlaştırılır ve artık yapıcıda:
$taxCalculation = $this->taxCalculationFactory->create();
Bu, bu özel durumda benim için sorunu çözdü.
Ve şimdi bir proxy kullanarak cevap:
Zincirdeki tüm bağımlılıkları tetiklemek istemiyorsanız, kurucunuzda bir proxy kullanmalısınız. Göre orijinal belgeler :
... yapıcı enjeksiyon, aynı zamanda, bir nesne oluşturduğunuzda, nesne başlatmanın zincirleme reaksiyonunun sıklıkla sonuç olduğu anlamına gelir.
ve:
... Proxy'ler, diğer sınıfları tembel yüklü sürümleri haline getirir. Yani, sınıfın metodlarından birinin gerçekte çağrılmasından sonra yaratılan proxy sınıfının gerçek bir örneğidir.
Yani benim durumumda TaxCalculationInterface
, tek yapmam gereken, vergi hesaplamamı kurucumda bir vekil olarak başlatmaktı:
/**
* @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;
}
Bu şekilde, sınıfım tembel yüklü. Şöyle ki: Ben sadece onun yöntemlerinden birini çağırdığımda başlatılır. Örneğin:
$rate = $this->taxCalculation->getCalculatedRate($productRateId);