Correction de l’erreur « La classe ne peut pas être enregistrée dans le répertoire généré/code »
Cet article décrit comment résoudre le problème où la manière dont vous avez spécifié les dépendances empêche les classes d’être générées automatiquement à la volée et où vous obtenez le message d’erreur La classe ne peut pas être enregistrée dans le répertoire généré/code.
Description description
Environnement
Adobe Commerce sur infrastructure cloud 2.2.0 ou version ultérieure
Problème/Symptômes
Procédure à suivre :
- Dans votre environnement local, écrivez une classe personnalisée avec une dépendance sur la classe générée automatiquement.
- Exécutez le scénario dans lequel votre classe personnalisée est déclenchée et vérifiez qu’elle fonctionne correctement.
- Validez et envoyez vos modifications à l’environnement d’intégration. Cela déclencherait le processus de déploiement. Le déploiement a réussi.
- Dans l’environnement d’intégration, exécutez le scénario dans lequel votre classe personnalisée est déclenchée.
Résultat attendu :
Tout fonctionne correctement, de la même manière que dans votre environnement local.
Résultat réel
Échec avec le message d’erreur indiquant que votre Classe ne peut pas être enregistrée dans le répertoire generate/code.
Cause première
La cause du problème est que la classe dont vous avez la dépendance n’est pas générée pendant le déploiement et ne peut pas être générée ultérieurement à la volée lorsque la classe est déclenchée, car le répertoire generated/code n’est pas disponible pour l’écriture une fois le déploiement terminé.
Il existe deux principales raisons à cela :
Cas 1 : La classe avec des dépendances sur des classes générées automatiquement est située dans le point d’entrée (comme index.php), qui n’est pas analysé pour les dépendances pendant le déploiement.
Cas 2 : la dépendance sur la classe générée automatiquement est spécifiée directement (comparez à l’utilisation recommandée d’un constructeur pour déclarer une dépendance).
Résolution resolution
Une solution commune pour les deux cas serait de créer une véritable usine au lieu de la classe auto-générée. Ou il y a une solution particulière pour chaque cas.
Solution spécifique au cas 1
Déplacez votre code de classe du point d’entrée vers un module distinct, puis utilisez-le dans le point d’entrée.
Exemple :
Code d’origine dans , par exemple index2.php :
<?phpuse YourVendor\SomeModule\Model\GeneratedFactory;
require realpath(__DIR__) . '/../app/bootstrap.php';$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
class SomeClass{ private $generatedFactory;
public function __construct(GeneratedFactory $generatedFactory) { $this->generatedFactory = $generatedFactory; }
// Some code here...}
$someObject = $bootstrap->getObjectManager()->create(SomeClass::class);
// There is some code that uses $someObject
Procédez comme suit :
-
Déplacez la définition de classe vers
app/code/YourVendor/YourModule:code language-none <?php namespace YourVendor\YourModule; use YourVendor\YourModule\Model\GeneratedFactory; class YourClass { private $generatedFactory; public function __construct(GeneratedFactory $generatedFactory) { $this->generatedFactory = $generatedFactory; } // Some code here... } -
Modifiez le point d’entrée
my_api/index.phpqu’il ressemble à ce qui suit :code language-none <?php use YourVendor\YourModule\YourClass; require realpath(__DIR__) . '/../app/bootstrap.php'; $bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER); $someObject = $bootstrap->getObjectManager()->create(YourClass::class); // Some code using $someObject
Solution spécifique au cas 2
Déplacez la déclaration de dépendance vers le constructeur .
Exemple :
Déclaration de classe originale :
<?phpnamespace YourVendor\YourModule;
use YourVendor\SomeModule\Model\GeneratedFactory;use Magento\Framework\App\ObjectManager;
class YourClass{ private $generatedFactory; private $someParam;
public function __construct($someParam) { $this--->someParam = $someParam; $this->generatedFactory = ObjectManager::getInstance()->get(GeneratedFactory::class); }
// Some code here...}
Vous devez modifier son constructeur comme suit :
<?phpnamespace YourVendor\YourModule;
use YourVendor\YourModule\Model\GeneratedFactory;use Magento\Framework\App\ObjectManager;
class YourClass{ private $generatedFactory; private $someParam;
public function __construct($someParam, GeneratedFactory $generatedFactory = null) { $this->someParam = $someParam; $this->generatedFactory = $generatedFactory ?: ObjectManager::getInstance()->get(GeneratedFactory::class); }
// Some code here...}
Lecture connexe
Génération de code dans notre documentation destinée aux développeurs.