Saya telah menemukan masalah ini lagi hari ini dan penting untuk mengetahui bahwa masalah ini dilemparkan setiap kali ketergantungan pada rantai memulai sebuah contoh yang perlu mengetahui keadaan aplikasi.
Dalam banyak kasus kesalahan ini terikat pada sesi (karena sesi perlu mengetahui keadaan aplikasi (frontend atau adminhtml)).
Dalam kasus saya, saya perlu memiliki Magento\Tax\Api\TaxCalculationInterface
perintah CLI, tetapi ini memerlukan pada beberapa titik dalam rantai ketergantungan sesi pelanggan (mungkin untuk mendapatkan kelompok pelanggan).
Sunting: Saya menemukan solusi yang lebih baik menggunakan proxy. Tapi demi sejarah, inilah jawaban saya sebelumnya:
Untuk mengatasi ini saya tidak menyertakan antarmuka ini dalam konstruktor saya, tetapi ini adalah pabrik:
/**
* @var \Magento\Tax\Api\TaxCalculationInterfaceFactory
*/
protected $taxCalculationFactory;
/**
* @param \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
) {
$this->taxCalculationFactory = $taxCalculationFactory;
}
Dengan cara ini, kelas hanya dipakai di satu metode di mana saya membutuhkannya, dan tidak lagi di konstruktor:
$taxCalculation = $this->taxCalculationFactory->create();
Ini memecahkan masalah bagi saya dalam kasus khusus ini.
Dan sekarang jawabannya menggunakan proxy:
Jika Anda tidak ingin memicu semua dependensi ke rantai, Anda harus menggunakan proxy di konstruktor Anda. Menurut dokumentasi asli :
... injeksi konstruktor juga berarti bahwa reaksi berantai instantiasi objek sering terjadi ketika Anda membuat objek.
dan:
... Proxy memperluas kelas lain untuk menjadi versi yang malas dari mereka. Yaitu, contoh nyata dari kelas yang diperluas oleh proxy yang dibuat hanya setelah salah satu metode kelas benar-benar dipanggil.
Jadi dalam situasi saya, dengan TaxCalculationInterface
, yang harus saya lakukan adalah membuat perhitungan pajak saya sebagai proksi dalam konstruktor saya:
/**
* @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;
}
Dengan cara ini, kelas saya dimuat dengan malas. Yaitu: itu hanya dipakai segera setelah saya memanggil salah satu metode itu. Sebagai contoh:
$rate = $this->taxCalculation->getCalculatedRate($productRateId);