Je reçois une erreur de suivi lors de la mise à jour des données via 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
Voici mon di.xml
dossier
<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>
Réponses:
La zone n'est pas définie dans la CLI de Magento (elle n'est pas requise pour les commandes principales). Il peut être défini au début de la
execute
méthode de votre commande :la source
admin
ouadminhtml
) - il y a une erreur:Area code already set
. Mais alors, si je le commente là-bas est encore une exception du sujet.\Magento\Framework\App\Area::AREA_*
constantes au lieu de chaînes codées en durbin/magento
tous les constructeurs sont exécutés, et si vous tentez de définir le code de zone 2 fois, une exception est levée Il est préférable de définir l'indicatif régional dans votreexecute()
méthode ou d'exécuter votre code en mode d'émulation magasin ou région si l'état est requis. En outre: les dépendances de constructeur susceptibles de déclencher une session en aval de la chaîne doivent être initialisées à l'aide d'une fabrique ou d'un proxy afin d'empêcher les dépendances de définir un indicatif régional.Aujourd'hui, je suis encore tombé sur ce problème et il est important de savoir que ce problème est posé chaque fois qu'une dépendance découle d'une instance qui nécessite de connaître l'état de l'application.
Dans de nombreux cas, cette erreur est liée à la session (car la session doit connaître l'état de l'application (frontend ou adminhtml)).
Dans mon cas, je devais avoir
Magento\Tax\Api\TaxCalculationInterface
une commande CLI, mais cela nécessite à un moment de sa chaîne de dépendance la session client (probablement pour obtenir le groupe de clients).Edit: J'ai trouvé une meilleure solution en utilisant des proxies. Mais pour les histoires, voici ma réponse précédente:
Pour résoudre ce problème, je n'ai pas inclus cette interface dans mon constructeur, mais plutôt son usine:
De cette façon, la classe n'est instanciée que dans la seule méthode où j'en avais besoin, et non plus dans le constructeur:
Cela a résolu le problème pour moi dans ce cas particulier.
Et maintenant la réponse en utilisant un proxy:
Si vous ne voulez pas déclencher toutes les dépendances en aval de la chaîne, vous devez utiliser un proxy dans votre constructeur. Selon la documentation originale :
et:
Donc, dans ma situation, avec
TaxCalculationInterface
, tout ce que j'avais à faire était d'instancier mon calcul de taxe comme proxy dans mon constructeur:De cette façon, ma classe est paresseuse chargée. C'est-à-dire: il n'est instancié que lorsque j'appelle l'une de ses méthodes. Par exemple:
la source
Vous ne devriez pas utiliser
setAreaCode
dans les__construct
commandes for pour la CLI. Lorsque vous exécutez une commande, Magento collecte et crée une instance pour chaque script enregistré dans votre application. S'il y en a plus d'un__construct
avec la définition de l'indicatif régional, vous aurez l'erreur.Je suppose préférable d'utiliser la
execute()
méthode pour définir l'indicatif régional. Vérifiez le module de catalogue:vendor/magento/module-catalog/Console/Command/ImagesResizeCommand.php
la source
bin/magento
tous les constructeurs sont exécutés, et si vous tentez de définir l'indicatif régional 2 fois, une exception est levée. Il est préférable de définir l'indicatif régional dans votreexecute()
méthode ou d'exécuter votre code en mode d'émulation magasin ou région si l'état est requis. En outre: les dépendances de constructeur susceptibles de déclencher une session en aval de la chaîne doivent être initialisées à l'aide d'une fabrique ou d'un proxy afin d'empêcher les dépendances de définir un indicatif régional.pour ce problème areaCode, si le paramètre 'frontend' ne fonctionne pas, essayez:
travaillait pour moi, espérons que cela aide
la source
try { $this->_state->... } finally { $this->executeMyCommand() }
Dans la plupart des cas, l'exception est causée par certaines actions effectuées dans la commande console. La solution (au lieu de définir l'indicatif régional) consiste à émuler l'indicatif régional et à exécuter l'action à l'aide de
$this->state->emulateAreaCode(Area::AREA_ADMINHTML, [$this, 'someAction'], []);
où
$state
est l'objet deMagento\Framework\App\State
. Il est difficile de définir une zone à un endroit différent, car cela peut entraîner des conflits entre les appels.la source
Le problème est qu’il n’a pas de méthode qui retourne false si la variable area_code n’a pas été définie. La solution que j'ai trouvée était de créer un remplacement de la classe d'état et de créer une nouvelle méthode pour valider si le code de zone était défini.
Dans mon fichier di.xml
Fichier Createad Webjump \ Abacos \ App \ State
Utilisation
la source
Dans magento 2, si vous définissez AreadCode mais obtenez quand même cette erreur, veuillez essayer le code suivant.
Magento\Framework\App\Bootstrap;
app/bootstrap.php;
Bootstrap::create(BP, $_SERVER);
$bootstrap->getObjectManager();
$objectManager->get('Magento\Framework\App\State');
la source
Je souffrais de l'erreur 'L'indicatif régional n'est pas défini' en cours d'exécution
bin/magento setup:upgrade
après l'importation de la base de données de la production. C'est un cas un peu différent de ce sujet, mais peut-être aidera quelqu'un. J'ai pu résoudre ce problème en exécutant localementbin/magento deploy:mode:set developer
alors que j'étais déjà en mode développeur. Magento a fait quelques ajustements de configuration, spécialement pour moi debug_logging a joué un rôle.la source
J'ai eu la solution en utilisant la classe proxy. Exemple est
Cela a résolu mon problème
la source
J'ai trouvé le même problème avec l'indicatif régional lors de la mise à niveau de l'installation.
J'ai désactivé tous les modules tiers et je cours
setup:upgrade
Ensuite, j'ai réactivé tous les modules tiers et exécuté la même commande. Le problème est résolu pour moi J'espère que ceci est une aide pour vous.
la source
Essayez de mettre à niveau magento à l’aide de la CLI que je trouve "code régional non défini" pour session et application. Mais je ne trouve pas quel module ou thème
vendor/magento/framework/App/State.php
.la source