"클래스를 코드 디렉터리에 저장할 수 없습니다" 오류

이 문서에서는 종속성을 지정한 방식으로 인해 클래스가 즉시 자동 생성되지 않고 "클래스가 생성된/코드 디렉터리" 오류 메시지가 표시되는 문제를 해결하는 방법에 대해 설명합니다.

영향을 받는 제품 및 버전

  • cloud infrastructure 2.2.0 이상 버전의 Adobe Commerce

문제

재현 단계

  1. 로컬 환경에서 자동 생성된 클래스에 종속된 사용자 지정 클래스를 작성합니다.
  2. 사용자 지정 클래스가 트리거되는 시나리오를 실행하고 제대로 작동하는지 확인합니다.
  3. 통합 환경에 변경 사항을 커밋하고 푸시합니다. 이렇게 하면 배포 프로세스가 트리거됩니다. 배포가 완료되었습니다.
  4. 통합 환경에서 사용자 지정 클래스가 트리거되는 시나리오를 실행합니다.

예상 결과

모든 것이 로컬 환경과 동일한 방식으로 올바르게 작동합니다.

실제 결과

클래스를 generated/code 디렉터리에 저장할 수 없다는 오류 메시지가 표시되면서 오류가 발생했습니다.

원인

배포 완료 후 generated/code 디렉터리를 쓰기에 사용할 수 없으므로 종속성이 있는 클래스가 배포 중에 생성되지 않으며 클래스를 트리거할 때 나중에 바로 생성할 수 없는 것이 문제의 원인입니다.

이러한 상황이 발생할 수 있는 이유는 두 가지가 있습니다.

  • 사례 1: 자동 생성된 클래스에 대한 종속성이 있는 클래스가 배포 중에 종속성에 대해 검사되지 않는 진입점( 예: index.php)에 있습니다.
  • 사례 2: 자동 생성된 클래스에 대한 종속성이 직접 지정됩니다(종속성을 선언하는 생성자의 권장 사용과 비교).

솔루션

두 가지 경우에 대한 한 가지 일반적인 해결 방법은 자동 생성된 클래스 대신 실제 팩토리를 만드는 것입니다.

또는 각 사례에 대한 특정 솔루션이 있습니다.

사례 1 특정 솔루션

진입점에서 별도의 모듈로 클래스 코드를 이동한 다음 진입점에서 사용합니다.

원본 코드(예: 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

다음 단계를 수행해야 합니다.

  1. 클래스 정의를 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. 다음과 같이 표시되도록 진입점 my_api/index.php을(를) 편집합니다.

    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
    

사례 2 특정 솔루션

종속성 선언을 생성자로 이동합니다.

원래 클래스 선언:

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

생성자를 다음과 같이 변경해야 합니다.

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

관련 읽기

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