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:
- In uw lokale milieu, schrijf een douaneklasse met een afhankelijkheid van de auto-geproduceerde klasse.
- Voer het scenario uit waarin de aangepaste klasse wordt geactiveerd en zie hoe deze correct werkt.
- Leg uw wijzigingen vast en duw op de integratieomgeving. Dit zou het plaatsingsproces teweegbrengen. Implementatie is geslaagd.
- 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:
-
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... } -
Bewerk het ingangspunt
my_api/index.phpzodat 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.