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:
-
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... } -
Modificare il punto di ingresso
my_api/index.phpin 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