Сегодня я снова столкнулся с этой проблемой, и важно знать, что эта проблема возникает, когда зависимость в цепочке инициирует экземпляр, которому необходимо знать состояние приложения.
Во многих случаях эта ошибка связана с сеансом (поскольку сеанс должен знать состояние приложения (веб-интерфейс или 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);