Causa

La causa del problema è che la classe sulla quale si ha la dipendenza non viene generata durante la distribuzione e non può essere generata in un secondo momento quando la classe viene attivata, perché la directory generated/code non è disponibile per la scrittura dopo il completamento della distribuzione.

Questo può accadere per due motivi principali:

  • Caso 1: la classe con dipendenze su classi generate automaticamente si trova nel punto di ingresso (ad esempio index.php ), che non viene analizzato per individuare dipendenze durante la distribuzione.
  • Caso 2: la dipendenza dalla classe generata automaticamente viene specificata direttamente (rispetto all'utilizzo consigliato del costruttore per dichiarare la dipendenza).

Soluzione

Una soluzione comune per entrambi i casi sarebbe la creazione di una fabbrica reale invece della classe generata automaticamente.

Oppure c'è una soluzione particolare per ogni caso.

Soluzione specifica per il caso 1

Spostare il codice di classe dal punto di ingresso a un modulo separato e quindi utilizzarlo nel punto di ingresso.

Esempio

Codice originale, ad esempio, 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

Devi effettuare le seguenti operazioni:

  1. Sposta la definizione della classe in app/code/YourVendor/YourModule:

       <?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. Modificare il punto di ingresso my_api/index.php in modo che sia simile al seguente:

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