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 :

  1. Dans votre environnement local, écrivez une classe personnalisée avec une dépendance sur la classe générée automatiquement.
  2. Exécutez le scénario dans lequel votre classe personnalisée est déclenchée et vérifiez qu’elle fonctionne correctement.
  3. Validez et envoyez vos modifications à l’environnement d’intégration. Cela déclencherait le processus de déploiement. Le déploiement a réussi.
  4. 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 :

  1. 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...        }
    
  2. Modifiez le point d’entrée my_api/index.php qu’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.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f