Podczas aktualizacji danych pojawia się błąd 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
Oto mój di.xml
plik
<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>
Odpowiedzi:
Obszar nie jest ustawiony w Magento CLI (nie jest wymagany dla żadnych podstawowych poleceń). Można go ustawić na początku
execute
metody polecenia :źródło
admin
lubadminhtml
) - wystąpił błąd:Area code already set
. Ale jeśli to skomentuję, będzie wyjątek od tematu.\Magento\Framework\App\Area::AREA_*
stałych zamiast ciągów zakodowanych na stałebin/magento
wszystkie konstruktory są wykonywane i jeśli próbujesz ustawić kod obszaru 2 razy, zgłaszany jest wyjątek. Lepiej ustawić kod obszaru wexecute()
metodzie lub uruchomić kod w emulacji sklepu lub obszaru, jeśli wymagany jest stan. Ponadto: zależności konstruktora, które mogą wyzwalać sesję w dół łańcucha, należy zainicjować za pomocą fabryki lub serwera proxy, aby zapobiec ustawianiu kodu obszaru przez zależności.Znowu natknąłem się na ten problem dzisiaj i ważne jest, aby wiedzieć, że ten problem jest zgłaszany, ilekroć zależność w dół łańcucha inicjuje instancję, która musi znać stan aplikacji.
W wielu przypadkach błąd ten jest związany z sesją (ponieważ sesja musi znać stan aplikacji (frontend lub adminhtml)).
W moim przypadku musiałem mieć
Magento\Tax\Api\TaxCalculationInterface
komendę CLI, ale wymaga to w pewnym momencie łańcucha zależności sesji klienta (prawdopodobnie w celu uzyskania grupy klientów).Edycja: Znalazłem lepsze rozwiązanie przy użyciu serwerów proxy. Ale ze względu na historię, oto moja poprzednia odpowiedź:
Aby rozwiązać ten problem, nie dodałem tego interfejsu do mojego konstruktora, ale raczej jest on fabryczny:
W ten sposób klasa jest tworzona tylko w jednej metodzie, w której jej potrzebowałem, a nie w konstruktorze:
To rozwiązało problem w tym konkretnym przypadku.
A teraz odpowiedź za pomocą proxy:
Jeśli nie chcesz wyzwalać wszystkich zależności w dół łańcucha, powinieneś użyć proxy w swoim konstruktorze. Według oryginalnej dokumentacji :
i:
Więc w mojej sytuacji, jedyne
TaxCalculationInterface
, co musiałem zrobić, to utworzyć kalkulację podatkową jako przybliżenie w moim konstruktorze:W ten sposób moja klasa jest leniwie załadowana. To znaczy: jest on tworzony tylko wtedy, gdy wywołam jedną z jego metod. Na przykład:
źródło
Nie należy używać
setAreaCode
w poleceniach__construct
for CLI. Po uruchomieniu dowolnego polecenia Magento zbiera i tworzy instancję dla każdego skryptu zarejestrowanego w aplikacji. Jeśli jest więcej niż jeden__construct
z definicją numeru kierunkowego, wystąpi błąd.Przypuszczam, że lepiej użyć tej
execute()
metody do ustawienia kodu kierunkowego. Sprawdź moduł katalogu:vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php
źródło
bin/magento
wszystkie konstruktory są wykonywane i jeśli próbujesz ustawić kod obszaru 2 razy, zgłaszany jest wyjątek. Lepiej ustawić kod obszaru wexecute()
metodzie lub uruchomić kod w emulacji sklepu lub obszaru, jeśli wymagany jest stan. Ponadto: zależności konstruktora, które mogą wyzwalać sesję w dół łańcucha, należy zainicjować za pomocą fabryki lub serwera proxy, aby zapobiec ustawianiu kodu obszaru przez zależności.w przypadku tego kodu areaCode, jeśli parametr „frontend” nie działa, spróbuj:
pracował dla mnie, mam nadzieję, że to pomaga
źródło
try { $this->_state->... } finally { $this->executeMyCommand() }
W większości przypadków wyjątek jest spowodowany niektórymi czynnościami wykonywanymi w poleceniu konsoli. Rozwiązaniem (zamiast ustawiania numeru kierunkowego) jest emulacja numeru kierunkowego i wykonywanie akcji za pomocą
$this->state->emulateAreaCode(Area::AREA_ADMINHTML, [$this, 'someAction'], []);
gdzie
$state
jest przedmiotemMagento\Framework\App\State
. Ustawienie obszaru w innym miejscu jest problemem, ponieważ może powodować konflikt między połączeniami.źródło
Problem polega na tym, że nie ma żadnej metody, która zwraca false, jeśli zmienna kod_pola nie została ustawiona. Sposób, w jaki znalazłem to rozwiązanie, polegał na utworzeniu zastąpienia klasy stanu i utworzeniu nowej metody sprawdzania poprawności, jeśli został ustawiony kod_pola.
W moim pliku di.xml
Utwórz plik Webjump \ Abacos \ App \ State
Posługiwać się
źródło
W Magento 2, jeśli ustawisz AreadCode, ale nadal pojawia się ten błąd, spróbuj wykonać następujący kod.
Magento\Framework\App\Bootstrap;
app/bootstrap.php;
Bootstrap::create(BP, $_SERVER);
$bootstrap->getObjectManager();
$objectManager->get('Magento\Framework\App\State');
źródło
Wystąpił błąd „Kod obszaru nie jest ustawiony” uruchomiony
bin/magento setup:upgrade
po importowaniu bazy danych z produkcji. To trochę inna sprawa niż ten temat, ale może komuś pomoże. Byłem w stanie rozwiązać ten problem działający lokalnie,bin/magento deploy:mode:set developer
mimo że byłem już w trybie programisty. Magento dokonało pewnych modyfikacji konfiguracji, specjalnie dla mnie odegrała rolę debug_logging.źródło
Mam rozwiązanie za pomocą klasy proxy. Przykładem jest
To naprawiło mój problem
źródło
Znalazłem ten sam problem z numerem kierunkowym podczas aktualizacji instalacji.
Wyłączyłem wszystkie moduły stron trzecich i uruchomiłem
setup:upgrade
Następnie ponownie włączyłem wszystkie moduły innych firm i uruchomiłem to samo polecenie. Problem został dla mnie rozwiązany. Mam nadzieję, że to jest pomoc dla ciebie.
źródło
Spróbuj zaktualizować Magento przy użyciu interfejsu CLI, niż znalazłem „numer kierunkowy nie definiuje” dla sesji i aplikacji, ale nie mogę znaleźć modułu lub motywu, więc po prostu wykonuję poniższe zmiany w
vendor/magento/framework/App/State.php
pliku i działa.źródło