Estou recebendo o seguinte erro ao atualizar os dados por meio de 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
A seguir está o meu di.xml
arquivo
<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
SK.
fonte
fonte
Respostas:
A área não está definida no Magento CLI (não é necessária para nenhum comando principal). Pode ser definido no início do
execute
método do seu comando :fonte
admin
ouadminhtml
) - há um erro:Area code already set
. Mas então, se eu comentar, há uma exceção de assunto novamente.\Magento\Framework\App\Area::AREA_*
constantes em vez de cordas hardcodedbin/magento
todos os construtores são executados e se o código de área for definido duas vezes, uma exceção será lançada. É melhor definir o código de área no seuexecute()
método, ou executar o código na emulação de loja ou área, se o estado for necessário. Além disso, as dependências do construtor que podem acionar uma sessão na cadeia devem ser inicializadas usando uma fábrica ou um proxy para impedir que as dependências definam um código de área.Eu me deparei com esse problema novamente hoje e é importante saber que esse problema é gerado sempre que uma dependência na cadeia inicia uma instância que precisa conhecer o estado do aplicativo.
Em muitos casos, esse erro é vinculado à sessão (já que a sessão precisa conhecer o estado do aplicativo (frontend ou adminhtml)).
No meu caso, eu precisava ter
Magento\Tax\Api\TaxCalculationInterface
um comando da CLI, mas isso requer em algum momento da cadeia de dependência a sessão do cliente (provavelmente para obter o grupo de clientes).Edit: Encontrei uma solução melhor usando proxies. Mas, pelo bem das histórias, aqui está a minha resposta anterior:
Para resolver isso, não incluí essa interface no meu construtor, mas a fábrica:
Dessa maneira, a classe é instanciada apenas no método em que eu precisei e não no construtor:
Isso resolveu o problema para mim neste caso específico.
E agora a resposta usando um proxy:
Se você não deseja acionar todas as dependências da cadeia, use um proxy em seu construtor. De acordo com a documentação original :
e:
Portanto, na minha situação, com o
TaxCalculationInterface
, tudo o que eu precisava fazer era instanciar meu cálculo de imposto como proxy no meu construtor:Dessa forma, minha turma é carregada preguiçosamente. Ou seja: só é instanciado assim que eu chamo um de seus métodos. Por exemplo:
fonte
Você não deve usar
setAreaCode
os__construct
comandos for CLI. Quando você executa qualquer comando, o Magento coleta e cria uma instância para cada script registrado no seu aplicativo. Se houver mais de um__construct
com definição de código de área, você terá o erro.Suponho que seja melhor usar o
execute()
método para definir o código de área. Verifique o módulo do catálogo:vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php
fonte
bin/magento
todos os construtores são executados e se o código de área for definido duas vezes, uma exceção será lançada. É melhor definir o código de área no seuexecute()
método, ou executar o código na emulação de loja ou área, se o estado for necessário. Além disso, as dependências do construtor que podem acionar uma sessão na cadeia devem ser inicializadas usando uma fábrica ou um proxy para impedir que as dependências definam um código de área.para este problema areaCode, se o parâmetro 'frontend' não estiver funcionando, tente:
estava trabalhando para mim, espero que ajude
fonte
try { $this->_state->... } finally { $this->executeMyCommand() }
Na maioria dos casos, a exceção é causada por algumas ações executadas no comando do console. A solução (em vez de definir o código de área) é emular o código de área e executar uma ação usando
$this->state->emulateAreaCode(Area::AREA_ADMINHTML, [$this, 'someAction'], []);
de onde
$state
é objetoMagento\Framework\App\State
. Definir a área em um local diferente é um problema, pois pode causar conflitos entre as chamadas.fonte
O problema é que ele não possui nenhum método que retorne false se a variável area_code não tiver sido configurada. A maneira que eu encontrei para resolver foi criando a substituição da classe state e criando um novo método para validar se o area_code foi definido.
No meu arquivo di.xml
Arquivo Createad Webjump \ Abacos \ App \ State
Usar
fonte
No magento 2, se você definir o AreadCode, mas ainda assim receber esse erro, tente o código a seguir.
Magento\Framework\App\Bootstrap;
app/bootstrap.php;
Bootstrap::create(BP, $_SERVER);
$bootstrap->getObjectManager();
$objectManager->get('Magento\Framework\App\State');
fonte
Eu estava com o erro 'Código de área não está definido' em execução
bin/magento setup:upgrade
após importar o banco de dados da produção. É um caso um pouco diferente do assunto deste tópico, mas talvez ajude alguém. Consegui resolver esse problema em execução local,bin/magento deploy:mode:set developer
apesar de já estar no modo de desenvolvedor. O Magento fez alguns ajustes na configuração, especialmente para mim, o debug_logging desempenhou um papel.fonte
Eu obtive a solução usando a classe proxy. Exemplo é
Isso corrigiu meu problema
fonte
Encontrei o mesmo problema com o código de área durante a atualização da instalação.
Desativei todos os módulos de terceiros e executei
setup:upgrade
Em seguida, reativei todos os módulos de terceiros e execute o mesmo comando. Problema resolvido para mim Espero que seja de ajuda para você.
fonte
Tente atualizar o magento usando o CLI do que encontrei 'código de área não define' para a sessão e o aplicativo. Mas não consigo encontrar qual módulo ou tema
vendor/magento/framework/App/State.php
.fonte