Сьогодні я знову наткнувся на цю проблему, і важливо знати, що ця проблема викидається кожного разу, коли залежність вниз по ланцюгу ініціює екземпляр, який повинен знати стан програми.
У багатьох випадках ця помилка пов'язана з сеансом (оскільки сеанс повинен знати стан програми (frontend або adminhtml)).
У моєму випадку мені потрібно було мати Magento\Tax\Api\TaxCalculationInterface
команду CLI, але це вимагає в певний момент її ланцюга залежності сеансу клієнта (можливо, щоб отримати групу клієнтів).
Редагувати: Я знайшов краще рішення за допомогою проксі. Але задля історії, ось моя попередня відповідь:
Для вирішення цього питання я не включив цей інтерфейс у свій конструктор, а скоріше це заводський:
/**
* @var \Magento\Tax\Api\TaxCalculationInterfaceFactory
*/
protected $taxCalculationFactory;
/**
* @param \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
) {
$this->taxCalculationFactory = $taxCalculationFactory;
}
Таким чином, клас інстанціюється лише в одному методі, де мені це було потрібно, і більше не в конструкторі:
$taxCalculation = $this->taxCalculationFactory->create();
Це вирішило для мене проблему в даному конкретному випадку.
А тепер відповідь за допомогою проксі:
Якщо ви не хочете запускати всі залежності по ланцюгу, вам слід використовувати проксі-сервер у своєму конструкторі. Відповідно до оригінальної документації :
... конструкторська інжекція також означає, що ланцюгова реакція при встановленні об'єкта часто є результатом при створенні об'єкта.
і:
... Проксі-сервери поширюють інші класи, щоб стати ліниво завантаженими їх версіями. Тобто реальний екземпляр класу розширюється проксі, створений лише після того, як насправді викликається один із методів класу.
Отже, в моїй ситуації, з тим TaxCalculationInterface
, що мені довелося зробити, - це лише обґрунтувати свій податковий розрахунок як проксі в моєму конструкторі:
/**
* @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;
}
Таким чином мій клас ледаче завантажений. Тобто: це лише примірник, як тільки я називаю один із його методів. Наприклад:
$rate = $this->taxCalculation->getCalculatedRate($productRateId);