"생성된/코드 디렉터리에 클래스를 저장할 수 없습니다." 오류 수정
이 문서에서는 종속성을 지정한 방식으로 인해 클래스가 즉시 자동 생성되지 않고 클래스가 생성된/코드 디렉터리 오류 메시지에 저장되지 않는 문제를 해결하는 방법에 대해 설명합니다.
설명 description
환경
cloud infrastructure 2.2.0 이상 버전의 Adobe Commerce
문제/증상
재현 단계:
- 로컬 환경에서 자동 생성된 클래스에 종속된 사용자 지정 클래스를 작성합니다.
- 사용자 지정 클래스가 트리거되는 시나리오를 실행하고 제대로 작동하는지 확인합니다.
- 통합 환경에 변경 사항을 커밋하고 푸시합니다. 이렇게 하면 배포 프로세스가 트리거됩니다. 배포가 완료되었습니다.
- 통합 환경에서 사용자 정의 클래스가 트리거되는 시나리오를 실행합니다.
예상 결과:
모든 것이 로컬 환경과 동일한 방식으로 올바르게 작동합니다.
실제 결과
클래스를 generated/code 디렉터리에 저장할 수 없다는 오류 메시지가 표시되면서 오류가 발생했습니다.
근본 원인
배포 중에 종속성이 있는 클래스가 생성되지 않으며 배포가 완료된 후 generated/code 디렉터리를 쓰기에 사용할 수 없으므로 클래스를 트리거할 때 나중에 바로 생성할 수 없습니다.
이러한 상황이 발생할 수 있는 이유는 두 가지가 있습니다.
사례 1: 자동 생성된 클래스에 대한 종속성이 있는 클래스가 배포 중 종속성에 대해 검사되지 않는 진입점(index.php 등)에 있습니다.
사례 2: 자동 생성된 클래스에 대한 종속성은 직접 지정됩니다(종속성을 선언하는 생성자의 권장 사용과 비교).
해결 방법 resolution
두 가지 경우에 대한 한 가지 일반적인 해결 방법은 자동 생성된 클래스 대신 실제 팩토리를 만드는 것입니다. 또는 각 사례에 대한 특정 솔루션이 있습니다.
사례 1 특정 솔루션
진입점에서 별도의 모듈로 클래스 코드를 이동한 다음 진입점에서 사용합니다.
예:
원본 코드(예: 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
다음 단계를 수행해야 합니다.
-
클래스 정의를
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... } -
진입점
my_api/index.php을(를) 다음과 같이 편집합니다.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
사례 2 특정 솔루션
종속성 선언을 생성자로 이동합니다.
예:
원래 클래스 선언:
<?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...}
생성자를 다음과 같이 변경해야 합니다.
<?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...}
관련 읽기
개발자 설명서에서 코드 생성.