Fehlerbehebung „Klasse kann nicht im Verzeichnis "/generate/code“ gespeichert werden“

In diesem Artikel wird beschrieben, wie Sie das Problem beheben können, dass die Art und Weise, wie Sie Abhängigkeiten angegeben haben, verhindert, dass Klassen automatisch im laufenden Betrieb generiert werden, und dass die Fehlermeldung Klasse kann nicht im Verzeichnis "/code“ gespeichert.

Beschreibung description

Umgebung

Adobe Commerce auf Cloud-Infrastruktur 2.2.0 oder höher

Problem/Symptome

Schritte zur Reproduktion:

  1. Schreiben Sie in Ihrer lokalen Umgebung eine benutzerdefinierte Klasse mit einer Abhängigkeit von der automatisch generierten Klasse.
  2. Führen Sie das Szenario aus, in dem Ihre benutzerdefinierte Klasse ausgelöst wird, und sehen Sie, wie sie ordnungsgemäß funktioniert.
  3. Übergeben Sie Ihre Änderungen und übertragen Sie sie in die Integrationsumgebung. Dadurch würde der Bereitstellungsprozess Trigger. Die Bereitstellung war erfolgreich.
  4. Führen Sie in der Integrationsumgebung das Szenario aus, in dem die benutzerdefinierte Klasse ausgelöst wird.

Erwartetes Ergebnis:

Alles funktioniert wie in Ihrer lokalen Umgebung.

Tatsächliches Ergebnis

Fehler mit der Fehlermeldung, dass Ihre Klasse nicht im Verzeichnis "/code“ gespeichert werden.

Grundursache

Die Ursache des Problems ist, dass die Klasse, von der Sie abhängig sind, während der Bereitstellung nicht generiert wird und nicht später spontan generiert werden kann, wenn die Klasse ausgelöst wird, da das generated/code-Verzeichnis nach Abschluss der Bereitstellung nicht zum Schreiben verfügbar ist.

Dafür gibt es zwei Hauptgründe:

1. Die Klasse mit Abhängigkeiten von automatisch generierten Klassen befindet sich im Einstiegspunkt (wie index.php), der während der Bereitstellung nicht auf Abhängigkeiten überprüft wird.
Fall 2: Die Abhängigkeit von der automatisch generierten Klasse wird direkt angegeben (im Vergleich zur empfohlenen Verwendung eines Konstruktors zum Deklarieren der Abhängigkeit).

Lösung resolution

Eine gemeinsame Lösung für beide Fälle wäre die Erstellung einer echten Factory anstelle der automatisch generierten Klasse. Oder es gibt für jeden Fall eine bestimmte Lösung.

Fallspezifische Lösung 1

Verschieben Sie den Klassencode vom Einstiegspunkt in ein separates Modul und verwenden Sie ihn dann im Einstiegspunkt.

Beispiel:

Originalcode in, z. B. 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

Sie müssen die folgenden Schritte ausführen:

  1. Klassendefinition nach app/code/YourVendor/YourModule verschieben:

    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. Bearbeiten Sie den Einstiegspunkt my_api/index.php so, dass er wie folgt aussieht:

    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
    

Case 2-spezifische Lösung

Verschieben Sie die Abhängigkeitsdeklaration an den Konstruktor.

Beispiel:

Ursprüngliche Klassendeklaration:

<?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...}

Sie müssen den Konstruktor wie folgt ändern:

<?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...}

Verwandtes Lesen

Code-Generierung in unserer Entwicklerdokumentation.

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