Correctie "Klasse kan niet worden opgeslagen in de gegenereerde/codedirectory"-fout

Dit artikel beschrijft hoe te om de kwestie te bevestigen waar de manier u gebiedsdelen specificeerde klassen verhindert worden auto-geproduceerd op de vlucht, en u krijgt de Klasse niet in het geproduceerde/code folder foutenbericht kan worden bewaard.

Beschrijving description

Omgeving

Adobe Commerce on cloud Infrastructure 2.2.0 of hoger

Probleem/symptomen

Stappen om te reproduceren:

  1. In uw lokale milieu, schrijf een douaneklasse met een afhankelijkheid van de auto-geproduceerde klasse.
  2. Voer het scenario uit waarin de aangepaste klasse wordt geactiveerd en zie hoe deze correct werkt.
  3. Leg uw wijzigingen vast en duw op de integratieomgeving. Dit zou het plaatsingsproces teweegbrengen. Implementatie is geslaagd.
  4. Voer in de integratieomgeving het scenario uit waarin de aangepaste klasse wordt geactiveerd.

Verwacht resultaat:

Alles werkt correct, net als in uw lokale omgeving.

Werkelijk resultaat

De mislukking met het foutenbericht die dat uw Klasse niet in de geproduceerde/codefolder kan worden bewaard.

Hoofdoorzaak

De oorzaak van het probleem is dat de klasse waarop u gebiedsdeel hebt niet tijdens de plaatsing wordt geproduceerd, en niet later op de vlucht kan worden geproduceerd wanneer de klasse wordt teweeggebracht, omdat de generated/code folder niet voor het schrijven na plaatsing is voltooid.

Er zijn twee belangrijke redenen waarom dit zou kunnen gebeuren:

Geval 1: de klasse met gebiedsdelen op auto-geproduceerde klassen wordt gevestigd in het ingangspunt (als index.php), dat niet voor gebiedsdelen tijdens plaatsing wordt gescand.
Geval 2: het gebiedsdeel van de auto-geproduceerde klasse wordt direct gespecificeerd (vergelijk met het geadviseerde gebruik van een aannemer om gebiedsdeel te verklaren).

Resolutie resolution

Een algemene oplossing voor beide gevallen is het maken van een echte fabriek in plaats van de automatisch gegenereerde klasse. Of er is een specifieke oplossing voor elk geval.

Specifieke oplossing voor geval 1

Verplaats uw klassecode van het ingangspunt naar een afzonderlijke module en gebruik deze vervolgens in het ingangspunt.

Voorbeeld:

Oorspronkelijke code in, bijvoorbeeld, 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

U moet de volgende stappen uitvoeren:

  1. Verplaats de klassedefinitie naar 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. Bewerk het ingangspunt my_api/index.php zodat het er als volgt uitziet:

    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
    

Specifieke oplossing voor geval 2

Verplaats de gebiedsdeelverklaring naar de aannemer.

Voorbeeld:

Oorspronkelijke klassendeclaratie:

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

U moet de constructor als volgt wijzigen:

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

Gerelateerde lezing

​ generatie van de Code ​ in onze ontwikkelaarsdocumentatie.

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