Fehler „Klasse kann nicht im Codeverzeichnis 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 Sie die Fehlermeldung Klasse kann nicht im Verzeichnis "/code“ gespeichert.

Betroffene Produkte und Versionen

  • Adobe Commerce auf Cloud-Infrastruktur 2.2.0 oder höher

Problem

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 die 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 Integrationsumgebung das Szenario aus, in dem Ihre benutzerdefinierte Klasse ausgelöst wird.

Erwartetes Ergebnis

Alles funktioniert wie in Ihrer lokalen Umgebung.

Tatsächliches Ergebnis

Fehler mit der Fehlermeldung, dass die Klasse nicht im generated/code gespeichert werden kann.

Ursache

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

Dafür gibt es zwei Hauptgründe:

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

Lösung

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 :

<?php
use 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-php
       <?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-php
      <?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

Verschiebt die Abhängigkeitsdeklaration in den Konstruktor.

Beispiel

Ursprüngliche Klassendeklaration:

<?php
namespace 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:

<?php
namespace 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

recommendation-more-help
8bd06ef0-b3d5-4137-b74e-d7b00485808a