Eu me deparei com esse problema novamente hoje e é importante saber que esse problema é gerado sempre que uma dependência na cadeia inicia uma instância que precisa conhecer o estado do aplicativo.
Em muitos casos, esse erro é vinculado à sessão (já que a sessão precisa conhecer o estado do aplicativo (frontend ou adminhtml)).
No meu caso, eu precisava ter Magento\Tax\Api\TaxCalculationInterface
um comando da CLI, mas isso requer em algum momento da cadeia de dependência a sessão do cliente (provavelmente para obter o grupo de clientes).
Edit: Encontrei uma solução melhor usando proxies. Mas, pelo bem das histórias, aqui está a minha resposta anterior:
Para resolver isso, não incluí essa interface no meu construtor, mas a fábrica:
/**
* @var \Magento\Tax\Api\TaxCalculationInterfaceFactory
*/
protected $taxCalculationFactory;
/**
* @param \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
) {
$this->taxCalculationFactory = $taxCalculationFactory;
}
Dessa maneira, a classe é instanciada apenas no método em que eu precisei e não no construtor:
$taxCalculation = $this->taxCalculationFactory->create();
Isso resolveu o problema para mim neste caso específico.
E agora a resposta usando um proxy:
Se você não deseja acionar todas as dependências da cadeia, use um proxy em seu construtor. De acordo com a documentação original :
... injeção de construtor também significa que uma reação em cadeia de instanciação de objeto geralmente é o resultado quando você cria um objeto.
e:
... Os proxies estendem outras classes para se tornarem versões preguiçosas deles. Ou seja, uma instância real da classe que um proxy estende criada apenas depois que um dos métodos da classe é realmente chamado.
Portanto, na minha situação, com o TaxCalculationInterface
, tudo o que eu precisava fazer era instanciar meu cálculo de imposto como proxy no meu construtor:
/**
* @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;
}
Dessa forma, minha turma é carregada preguiçosamente. Ou seja: só é instanciado assim que eu chamo um de seus métodos. Por exemplo:
$rate = $this->taxCalculation->getCalculatedRate($productRateId);