Я получаю следующую ошибку при обновлении данных через 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
Ниже мой di.xml
файл
<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>
magento2
magento-2.0
Пестрый
источник
источник
Ответы:
Область не устанавливается в Magento CLI (она не требуется для каких-либо основных команд). Это может быть установлено в начале метода вашей команды
execute
:источник
admin
илиadminhtml
) - есть ошибка:Area code already set
. Но потом, если я это прокомментирую, снова будет исключение из темы.\Magento\Framework\App\Area::AREA_*
константы вместо жестко закодированных строкbin/magento
все конструкторы выполняются, и если код области пытаются установить 2 раза, генерируется исключение. Лучше установить код города в вашемexecute()
-методе или запустить код в эмуляции магазина или области, если требуется состояние. Также: зависимости конструктора, которые могут инициировать сеанс в цепочке, должны быть инициализированы с использованием фабрики или прокси-сервера, чтобы зависимости не могли установить код города.Сегодня я снова столкнулся с этой проблемой, и важно знать, что эта проблема возникает, когда зависимость в цепочке инициирует экземпляр, которому необходимо знать состояние приложения.
Во многих случаях эта ошибка связана с сеансом (поскольку сеанс должен знать состояние приложения (веб-интерфейс или adminhtml)).
В моем случае мне нужно было
Magento\Tax\Api\TaxCalculationInterface
ввести команду CLI, но в какой-то момент в ее цепочке зависимостей требуется сеанс клиента (возможно, чтобы получить группу клиентов).Изменить: я нашел лучшее решение, используя прокси. Но ради истории, вот мой предыдущий ответ:
Чтобы решить эту проблему, я не включил этот интерфейс в свой конструктор, а скорее это фабрика:
Таким образом, класс создается только в одном методе, где он мне нужен, и больше не в конструкторе:
Это решило проблему для меня в данном конкретном случае.
А теперь ответ с помощью прокси:
Если вы не хотите запускать все зависимости в цепочке, вы должны использовать прокси в своем конструкторе. Согласно оригинальной документации :
а также:
Так что в моей ситуации, с
TaxCalculationInterface
, все, что мне нужно было сделать, это создать мой расчет налога в качестве прокси в моем конструкторе:Таким образом, мой класс загружен. То есть: он создается только тогда, когда я вызываю один из его методов. Например:
источник
Вы не должны использовать
setAreaCode
в__construct
командах для CLI. При запуске любой команды Magento собирайте и создавайте экземпляр для каждого скрипта, зарегистрированного в вашем приложении. Если есть более одного__construct
с определением кода города, у вас будет ошибка.Я полагаю, лучше использовать
execute()
метод для установки кода города. Проверьте модуль каталога:vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php
источник
bin/magento
все конструкторы выполняются, и если код области пытаются установить 2 раза, генерируется исключение. Лучше установить код города в вашемexecute()
-методе или запустить код в эмуляции магазина или области, если требуется состояние. Также: зависимости конструктора, которые могут инициировать сеанс в цепочке, должны быть инициализированы с использованием фабрики или прокси-сервера, чтобы зависимости не могли установить код города.для этой проблемы areaCode, если параметр 'frontend' не работает, попробуйте:
работал на меня, надеюсь, это поможет
источник
try { $this->_state->... } finally { $this->executeMyCommand() }
В большинстве случаев исключение вызвано некоторыми действиями, выполняемыми в консольной команде. Решение (вместо установки кода области) состоит в том, чтобы эмулировать код области и выполнять действия, используя
$this->state->emulateAreaCode(Area::AREA_ADMINHTML, [$this, 'someAction'], []);
где
$state
объектMagento\Framework\App\State
. Установка области в другом месте - проблема, потому что это может вызвать конфликт между вызовами.источник
Проблема в том, что у него нет метода, который возвращает false, если переменная area_code не была установлена. Я нашел способ решить эту проблему, создав переопределение класса состояния и создав новый метод для проверки, был ли задан код_области.
В моем файле di.xml
Создать файл Webjump \ Abacos \ App \ State
использование
источник
В magento 2, если вы установили AreadCode, но все еще получаете эту ошибку, пожалуйста, попробуйте следующий код.
Magento\Framework\App\Bootstrap;
app/bootstrap.php;
Bootstrap::create(BP, $_SERVER);
$bootstrap->getObjectManager();
$objectManager->get('Magento\Framework\App\State');
источник
Я страдал от ошибки «Код города не установлен», запущенной
bin/magento setup:upgrade
после импорта базы данных из производства. Это немного другой случай, чем эта тема, но, возможно, поможет кому-то. Мне удалось решить эту проблему локально,bin/magento deploy:mode:set developer
несмотря на то, что я уже был в режиме разработчика. Magento сделал некоторые настройки конфигурации, специально для меня сыграла роль debug_logging.источник
Я получил решение с помощью прокси-класса. Пример
Это исправило мою проблему
источник
Я обнаружил ту же проблему с кодом города при обновлении установки.
Я отключил все сторонние модули и запускаю
setup:upgrade
Затем я снова включил все сторонние модули и выполнил ту же команду. Проблема решена для меня Надеюсь, что это помощь для вас.
источник
Попробуйте обновить magento с помощью CLI, чем я обнаружил «код области не определен» для сессии и приложения. Но я не могу найти какой модуль или тему. Поэтому я просто делаю изменения в
vendor/magento/framework/App/State.php
файле ниже, и это работает.источник