Magento 2 - オブジェクト マネージャーは Abstract クラスをインスタンス化しようとします。( 致命的な誤り )
-
13-12-2019 - |
質問
Magento 2 をいじっていますが、理解できない問題に遭遇しました。オブジェクト マネージャーが抽象クラスをインスタンス化しようとすると、致命的エラーが発生します。誰かがこれの原因を知っているか、または私に正しい方向を示してくれますか?
エラー
Fatal error: Cannot instantiate abstract class Magento\Framework\Model\Resource\AbstractResource in /lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php on line 75
問題
私のモジュールには、 \Magento\Quote\Model\Quote
. 。このモデルのコンストラクターには、これを注入する次の行があります。
\Magento\Framework\Model\Resource\AbstractResource $resource = null,
.
モデルをインスタンス化しているコントローラーは、 \Magento\Backend\App\Action
そして使用します $this->_objectManager->create()
モデルをインスタンス化します。
私が頭を抱えきれないのは、Magento モデルをインスタンス化すると正常に機能しますが、モデルをインスタンス化すると、この抽象クラスをインスタンス化しようとして上記のエラーがスローされるということです。オブジェクト マネージャーにこれを行うよう指示するものは何ですか?また、問題を解決するにはどうすればよいですか?
私が最初に考えたのは、Magento が di.xml
これを置き換えたり、これを実行したりするのに、そうではありませんでした。
時間を割いて読んでいただきありがとうございます。この問題に関するご支援やご意見をいただければ幸いです。
解決
これは、サブクラスが親クラスの既存のオプションの依存関係の後に新しい依存関係を追加した場合に発生する可能性があります。
親からのスニペット
\Magento\Quote\Model\Cart\CurrencyFactory $currencyFactory, // required
JoinProcessorInterface $extensionAttributesJoinProcessor, // required
\Magento\Framework\Model\Resource\AbstractResource $resource = null, //optional
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, //optional
array $data = [] //optional
)}
コードがオプションの内容をどのように変更するか
\Magento\Quote\Model\Cart\CurrencyFactory $currencyFactory, // required
JoinProcessorInterface $extensionAttributesJoinProcessor, // required
\Magento\Framework\Model\Resource\AbstractResource $resource = null, // required (even though it has a default value, because it is followed by parameters that don't have default values)
int $x, // required
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, // optional (still optional because there are no required parameters following it)
array $data = [] // optional
)}
Magento 2 オブジェクト マネージャーは、必要なパラメーターを挿入しようとします。したがって、コンストラクターの最後に必須パラメーターを追加すると、これが発生する可能性があります。
この問題は、新しい必須パラメータをオプションのパラメータの上に移動することで修正できます。
他のヒント
場合によっては、一部のモジュールが更新されていて、/generated の下の参照がまだ更新されていないことがありました。
ただやってください bin/magento setup:di:compile
そしてさらに試みる。
(支払いモジュールを更新し、/checkout が読み込まれなかったときにうまくいきました)