Beim Aktualisieren der Daten erhalte ich folgende Fehlermeldung CustomerRepositoryInterface
[Magento\Framework\Exception\SessionException]
Area code not set: Area code must be set before starting a session.
[Magento\Framework\Exception\LocalizedException]
Area code is not set
Es folgt meine di.xml
Akte
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\Console\CommandList">
<arguments>
<argument name="commands" xsi:type="array">
<item name="test1_command" xsi:type="object">Test\Module\Console\Command\Test1Command</item>
<item name="test2_command" xsi:type="object">Test\Module\Console\Command\Test2Command</item>
</argument>
</arguments>
</type>
</config>
Antworten:
Der Bereich ist in Magento CLI nicht festgelegt (für Kernbefehle nicht erforderlich). Sie kann zu Beginn der
execute
Methode Ihres Befehls festgelegt werden:quelle
admin
oderadminhtml
) - gibt es einen Fehler:Area code already set
. Aber dann, wenn ich es auskommentiere, gibt es wieder eine Ausnahme vom Thema.\Magento\Framework\App\Area::AREA_*
Konstanten anstelle von fest codierten Zeichenfolgen verwendenbin/magento
alle Konstruktoren ausgeführt, und wenn versucht wird, die Ortsvorwahl zweimal festzulegen, wird eine Ausnahme ausgelöst. Es ist besser, die Ortsvorwahl in Ihrerexecute()
-Methode festzulegen oder sie in der Speicher- oder Gebietsemulation auszuführen, wenn der Status erforderlich ist. Außerdem: Konstruktorabhängigkeiten, die eine Sitzung in der Kette auslösen könnten, sollten mithilfe einer Factory oder eines Proxys initialisiert werden, um zu verhindern, dass Abhängigkeiten eine Vorwahl festlegen.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:
Auf diese Weise wird die Klasse nur in der einen Methode instanziiert, in der ich sie benötigte, und nicht mehr im Konstruktor:
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 :
und:
Also musste ich in meiner Situation mit dem nur
TaxCalculationInterface
meine Steuerberechnung als Proxy in meinem Konstruktor instanziieren:Auf diese Weise ist meine Klasse faul geladen. Das heißt: Es wird nur instanziiert, sobald ich eine seiner Methoden aufrufe. Zum Beispiel:
quelle
Sie sollten
setAreaCode
in den__construct
Befehlen für CLI nicht verwenden . Wenn Sie einen Befehl ausführen, sammelt und erstellt Magento eine Instanz für jedes in Ihrer Anwendung registrierte Skript. Wenn es mehr als eine__construct
mit Vorwahldefinition gibt, tritt der Fehler auf.Ich nehme an, es ist besser, die
execute()
Methode zum Festlegen der Ortsvorwahl zu verwenden. Überprüfen Sie das Katalogmodul:vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php
quelle
bin/magento
alle Konstruktoren ausgeführt, und wenn versucht wird, die Ortsvorwahl zweimal festzulegen, wird eine Ausnahme ausgelöst. Es ist besser, die Ortsvorwahl in Ihrerexecute()
-Methode festzulegen oder sie in der Speicher- oder Gebietsemulation auszuführen, wenn der Status erforderlich ist. Außerdem: Konstruktorabhängigkeiten, die eine Sitzung in der Kette auslösen könnten, sollten mithilfe einer Factory oder eines Proxys initialisiert werden, um zu verhindern, dass Abhängigkeiten eine Vorwahl festlegen.Wenn der Parameter 'frontend' bei diesem areaCode-Problem nicht funktioniert, versuchen Sie Folgendes:
arbeitete für mich, hoffe es hilft
quelle
try { $this->_state->... } finally { $this->executeMyCommand() }
In den meisten Fällen wird die Ausnahme durch einige Aktionen verursacht, die im Konsolenbefehl ausgeführt werden. Die Lösung (anstatt die Vorwahl einzustellen) besteht darin, die Vorwahl zu emulieren und die Aktion mit auszuführen
$this->state->emulateAreaCode(Area::AREA_ADMINHTML, [$this, 'someAction'], []);
wo
$state
ist Gegenstand vonMagento\Framework\App\State
. Das Festlegen eines Bereichs an einem anderen Ort ist ein Problem, da es zu Konflikten zwischen Anrufen kommen kann.quelle
Das Problem ist, dass es keine Methode gibt, die false zurückgibt, wenn die Variable area_code nicht festgelegt wurde. Ich fand es zu lösen, indem ich eine Überschreibung der Zustandsklasse erstellte und eine neue Methode erstellte, um zu überprüfen, ob die area_code gesetzt war.
In meiner Datei di.xml
Erstellen Sie die Datei Webjump \ Abacos \ App \ State
Verwenden
quelle
Wenn Sie in Magento 2 AreadCode einstellen, aber dennoch diese Fehlermeldung erhalten, versuchen Sie bitte den folgenden Code.
Magento\Framework\App\Bootstrap;
app/bootstrap.php;
Bootstrap::create(BP, $_SERVER);
$bootstrap->getObjectManager();
$objectManager->get('Magento\Framework\App\State');
quelle
Ich hatte den Fehler "Vorwahl ist nicht eingestellt",
bin/magento setup:upgrade
nachdem die Datenbank aus der Produktion importiert wurde. Es ist ein bisschen anders als in diesem Thema, aber vielleicht hilft es jemandem. Ich konnte dieses Problem lokal beheben,bin/magento deploy:mode:set developer
obwohl ich mich bereits im Entwicklermodus befand. Magento hat einige Konfigurationsanpassungen vorgenommen, speziell für mich spielte debug_logging eine Rolle.quelle
Ich habe die Lösung mithilfe der Proxy-Klasse erhalten. Beispiel ist
Dies hat mein Problem behoben
quelle
Ich habe das gleiche Problem mit der Vorwahl beim Setup-Upgrade festgestellt.
Ich habe alle Module von Drittanbietern deaktiviert und lauffähig gemacht
setup:upgrade
Dann habe ich alle Module von Drittanbietern wieder aktiviert und den gleichen Befehl ausgeführt. Problem ist für mich gelöst Hoffe das ist Hilfe für dich.
quelle
Versuchen Sie, Magento mit der CLI zu aktualisieren, als ich "Vorwahl nicht definiert" für Sitzung & App gefunden habe. Aber ich kann nicht finden, welches Modul oder Thema
vendor/magento/framework/App/State.php
.quelle