Ich bin heute wieder auf dieses Problem gestoßen, und es ist wichtig zu wissen, dass dieses Problem immer dann auftritt, wenn eine Abhängigkeit in der Kette eine Instanz initiiert, die den Status der Anwendung kennen muss.
In vielen Fällen ist dieser Fehler sitzungsgebunden (da die Sitzung den Status der Anwendung (Frontend oder Adminhtml) kennen muss).
In meinem Fall musste ich Magento\Tax\Api\TaxCalculationInterface
in einem CLI-Befehl, aber dies erfordert irgendwann in seiner Abhängigkeitskette die Kundensitzung (wahrscheinlich, um die Kundengruppe zu erhalten).
Edit: Ich habe eine bessere Lösung mit Proxies gefunden. Aber um der Geschichte willen, hier ist meine vorherige Antwort:
Um dies zu lösen, habe ich dieses Interface nicht in meinen Konstruktor aufgenommen, sondern es ist 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;
}
Auf diese Weise wird die Klasse nur in der einen Methode instanziiert, in der ich sie benötigte, und nicht mehr im Konstruktor:
$taxCalculation = $this->taxCalculationFactory->create();
Dies löste das Problem für mich in diesem speziellen Fall.
Und jetzt die Antwort per Proxy:
Wenn Sie nicht alle Abhängigkeiten in der Kette auslösen möchten, sollten Sie einen Proxy in Ihrem Konstruktor verwenden. Nach Angaben der Original - Dokumentation :
... Konstruktorinjektion bedeutet auch, dass eine Kettenreaktion der Objektinstanziierung häufig die Folge ist, wenn Sie ein Objekt erstellen.
und:
... Proxies erweitern andere Klassen, um faul geladene Versionen von ihnen zu werden. Dies bedeutet, dass eine reale Instanz der Klasse, die ein Proxy erweitert, erst erstellt wird, nachdem eine der Methoden der Klasse tatsächlich aufgerufen wurde.
Also musste ich in meiner Situation mit dem nur TaxCalculationInterface
meine Steuerberechnung als Proxy in meinem Konstruktor instanziieren:
/**
* @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;
}
Auf diese Weise ist meine Klasse faul geladen. Das heißt: Es wird nur instanziiert, sobald ich eine seiner Methoden aufrufe. Zum Beispiel:
$rate = $this->taxCalculation->getCalculatedRate($productRateId);