Fout: "Klasse kan niet worden opgeslagen in de codedirectory"

Dit artikel beschrijft hoe te om de kwestie te bevestigen waar de manier u gebiedsdelen specificeerde voorkomt klassen worden auto-geproduceerd op de vlucht, en u krijgt "Klasse kan niet in de geproduceerde/codefolder worden bewaard" foutenmelding.

Betrokken producten en versies

  • Adobe Commerce on cloud Infrastructure 2.2.0 of hoger

Probleem

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, waarbij de aangepaste klasse wordt geactiveerd, en zie hoe het werkt.
  3. Leg uw wijzigingen vast en duw op de integratieomgeving. Dit zou het plaatsingsproces teweegbrengen. Implementatie is geslaagd.
  4. In het integratiemilieu, stel het scenario in werking waar uw douaneklasse wordt teweeggebracht.

Verwacht resultaat

Alles werkt correct, net als in uw lokale omgeving.

Werkelijk resultaat

Fout bij het foutbericht dat aangeeft dat uw klasse niet in de map generated/code kan worden opgeslagen.

Oorzaak

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:

  • Case 1: De klasse met afhankelijkheden van automatisch gegenereerde klassen bevindt zich in het ingangspunt (zoals index.php ), dat tijdens de implementatie niet is gescand op afhankelijkheden.
  • Geval 2: De afhankelijkheid van de auto-geproduceerde klasse wordt gespecificeerd direct (vergelijk aan het geadviseerde gebruik van aannemer om gebiedsdeel te verklaren).

Oplossing

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 :

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

U moet de volgende stappen uitvoeren:

  1. Verplaats de klassedefinitie naar app/code/YourVendor/YourModule :

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

    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
    

Specifieke oplossing voor geval 2

Afhankelijkheidsdeclaratie verplaatsen naar de constructor.

Voorbeeld

Oorspronkelijke klassendeclaratie:

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

U moet de constructor als volgt wijzigen:

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

Gerelateerde lezing

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