Oggi mi sono imbattuto nuovamente in questo problema ed è importante sapere che questo problema viene generato ogni volta che una dipendenza lungo la catena avvia un'istanza che deve conoscere lo stato dell'applicazione.
In molti casi questo errore è associato alla sessione (poiché la sessione deve conoscere lo stato dell'applicazione (frontend o adminhtml)).
Nel mio caso avevo bisogno di avere Magento\Tax\Api\TaxCalculationInterface
un comando CLI, ma questo ad un certo punto richiede nella sua catena di dipendenze la sessione del cliente (probabilmente per ottenere il gruppo di clienti).
Modifica: ho trovato una soluzione migliore usando i proxy. Ma per il bene delle storie, ecco la mia risposta precedente:
Per risolvere questo problema non ho incluso questa interfaccia nel mio costruttore, ma piuttosto è factory:
/**
* @var \Magento\Tax\Api\TaxCalculationInterfaceFactory
*/
protected $taxCalculationFactory;
/**
* @param \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
) {
$this->taxCalculationFactory = $taxCalculationFactory;
}
In questo modo, la classe viene istanziata solo nell'unico metodo in cui ne avevo bisogno e non più nel costruttore:
$taxCalculation = $this->taxCalculationFactory->create();
Ciò ha risolto il problema per me in questo caso particolare.
E ora la risposta usando un proxy:
Se non vuoi innescare tutte le dipendenze lungo la catena, dovresti usare un proxy nel tuo costruttore. Secondo la documentazione originale :
... l'iniezione del costruttore significa anche che una reazione a catena dell'istanza di un oggetto è spesso il risultato quando si crea un oggetto.
e:
... I proxy estendono altre classi per trasformarli in versioni a caricamento lento. Ossia, un'istanza reale della classe estesa da un proxy creata solo dopo che uno dei metodi della classe viene effettivamente chiamato.
Quindi nella mia situazione, con il TaxCalculationInterface
, tutto ciò che dovevo fare era creare un'istanza del mio calcolo delle imposte come proxy nel mio costruttore:
/**
* @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;
}
In questo modo, la mia classe è pigra. Cioè: viene istanziato non appena chiamo uno dei suoi metodi. Per esempio:
$rate = $this->taxCalculation->getCalculatedRate($productRateId);