修正「類別無法儲存在產生的/程式碼目錄中」錯誤
本文說明如何修正您所指定的相依性方式無法即時自動產生類別,且無法將 類別儲存在產生的/程式碼目錄 錯誤訊息中的問題。
說明 description
環境
雲端基礎結構上的Adobe Commerce 2.2.0或更新版本
問題/症狀
要再現的步驟:
- 在您的本機環境中,撰寫與自動產生的類別相依的自訂類別。
- 執行觸發自訂類別的案例,並檢視其是否正常運作。
- 認可並將變更推送至整合環境。 這將觸發部署流程。 部署成功。
- 在整合環境中,執行觸發自訂類別的案例。
預期結果:
一切皆正確運作,就像在本機環境中一樣。
實際結果
失敗,錯誤訊息指出您的 類別無法儲存在產生的/程式碼目錄 中。
根本原因
問題的原因是在部署期間不會產生您具有相依性的類別,而且無法在稍後觸發類別時即時產生,因為在部署完成之後,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...}
相關閱讀
在開發人員檔案中程式碼產生。
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f