Recibo el siguiente error al actualizar los datos a través 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
Siguiente es mi di.xml
archivo
<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>
Respuestas:
El área no está configurada en Magento CLI (no es necesario para ningún comando central). Se puede configurar al comienzo del
execute
método de su comando :fuente
admin
oadminhtml
) - hay un error:Area code already set
. Pero luego, si lo comento, hay una excepción del tema nuevamente.\Magento\Framework\App\Area::AREA_*
constantes en lugar de cadenas codificadasbin/magento
todos los constructores se ejecutan, y si se intenta establecer el código de área 2 veces, se genera una excepción. Es mejor establecer el código de área en suexecute()
método, o ejecutar su código en la tienda o emulación de área si se requiere un estado. Además: las dependencias del constructor que podrían desencadenar una sesión en la cadena deben inicializarse utilizando una fábrica o un proxy para evitar que las dependencias establezcan un código de área.Hoy he vuelto a tropezar con este problema y es importante saber que este problema se produce cada vez que una dependencia en la cadena inicia una instancia que necesita conocer el estado de la aplicación.
En muchos casos, este error está vinculado a la sesión (ya que la sesión necesita conocer el estado de la aplicación (frontend o adminhtml)).
En mi caso, necesitaba tener
Magento\Tax\Api\TaxCalculationInterface
un comando CLI, pero esto requiere en algún momento de su cadena de dependencia la sesión del cliente (probablemente para obtener el grupo de clientes).Editar: encontré una mejor solución usando proxies. Pero por el bien de las historias, aquí está mi respuesta anterior:
Para resolver esto, no incluí esta interfaz en mi constructor, sino que es de fábrica:
De esta manera, la clase solo se instancia en el método donde lo necesitaba, y ya no en el constructor:
Esto resolvió el problema para mí en este caso particular.
Y ahora la respuesta usando un proxy:
Si no desea activar todas las dependencias en la cadena, debe usar un proxy en su constructor. Según la documentación original :
y:
Entonces, en mi situación, con el
TaxCalculationInterface
, todo lo que tenía que hacer era instanciar mi cálculo de impuestos como proxy en mi constructor:De esta manera, mi clase está perezosa. Es decir: solo se crea una instancia tan pronto como llamo a uno de sus métodos. Por ejemplo:
fuente
No debe usar
setAreaCode
en los__construct
comandos para CLI. Cuando ejecuta cualquier comando, Magento recopila y crea instancias para cada script registrado en su aplicación. Si hay más de uno__construct
con la definición del código de área, tendrá el error.Supongo que es mejor usar el
execute()
método para establecer el código de área. Consulte el módulo del catálogo:vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php
fuente
bin/magento
todos los constructores se ejecutan, y si se intenta establecer el código de área 2 veces, se genera una excepción. Es mejor establecer el código de área en suexecute()
método, o ejecutar su código en la tienda o emulación de área si se requiere un estado. Además: las dependencias del constructor que podrían desencadenar una sesión en la cadena deben inicializarse utilizando una fábrica o un proxy para evitar que las dependencias establezcan un código de área.para este problema de areaCode, si el parámetro 'frontend' no funciona, intente:
estaba trabajando para mí, espero que ayude
fuente
try { $this->_state->... } finally { $this->executeMyCommand() }
En la mayoría de los casos, la excepción es causada por algunas acciones realizadas en el comando de la consola. La solución (en lugar de configurar el código de área) es emular el código de área y realizar acciones usando
$this->state->emulateAreaCode(Area::AREA_ADMINHTML, [$this, 'someAction'], []);
donde
$state
es objeto deMagento\Framework\App\State
. Establecer el área en un lugar diferente es un problema, ya que puede causar conflictos entre las llamadas.fuente
El problema es que no tiene ningún método que devuelva falso si la variable area_code no se ha establecido. La forma en que lo resolví fue creando una anulación de la clase de estado y creando un nuevo método para validar si se configuró el area_code.
En mi archivo di.xml
Archivo Createad Webjump \ Abacos \ App \ State
Utilizar
fuente
En magento 2, si configura AreadCode pero aún recibe este error, intente seguir el código.
Magento\Framework\App\Bootstrap;
app/bootstrap.php;
Bootstrap::create(BP, $_SERVER);
$bootstrap->getObjectManager();
$objectManager->get('Magento\Framework\App\State');
fuente
Estaba sufriendo el error 'El código de área no está configurado' ejecutándose
bin/magento setup:upgrade
después de importar la base de datos de producción. Es un caso un poco diferente al de este tema, pero quizás ayude a alguien. Pude resolver este problema a nivel local abin/magento deploy:mode:set developer
pesar de que ya estaba en modo desarrollador. Magento hizo algunos ajustes de configuración, especialmente para mí debug_logging desempeñado papel.fuente
Obtuve la solución usando la clase proxy. Ejemplo es
Esto solucionó mi problema
fuente
He encontrado el mismo problema con el código de área durante la actualización de la configuración.
He desactivado todos los módulos de terceros y ejecuto
setup:upgrade
Luego he vuelto a habilitar todos los módulos de terceros y ejecuto el mismo comando. El problema está resuelto para mí Espero que esto sea de ayuda para ti.
fuente
Intente actualizar magento usando CLI que encontré 'código de área no definido' para sesión y aplicación. Pero no puedo encontrar qué módulo o tema. Así que solo hago los cambios a continuación en el
vendor/magento/framework/App/State.php
archivo y está funcionando.fuente