Magento 2、Object Managerは他のオブジェクトを渡し、その後予想されます。
-
28-09-2020 - |
質問
マゼント2オブジェクトマネージャと依存関係の注入を把握していると思うときは、理解できないものが発生します。context
EN pagefactory
オブジェクトを渡すと思いますが、Magentoはそうではないと言っています。2番目のものは間違っているようです。
Recoverable Error: Argument 2 passed to Demo\Hello\Controller\Adminhtml\Order\MassPrint::__construct() must be an instance of Magento\Framework\View\Result\PageFactory, instance of Magento\Framework\App\ResourceConnection given, called in
.
コントローラ:
<?php
namespace Demo\Hello\Controller\Adminhtml\Order;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
class MassPrint extends \Magento\Backend\App\Action {
public function __construct(Context $context, PageFactory $pageFactory) {
parent::__construct($context);
}
}
.
私が欲しいようなヒントを理解しています:
must be an instance of Magento\Framework\View\Result\PageFactory
.
しかしそれは
を渡しますinstance of Magento\Framework\App\ResourceConnection given
.
これはなぜですか?私が理解していないマゼントと何らかの魔法があります(まだ)。
解決
tl; dr
Interceptor.php
でエラーが発生した場合は、さらに見る前に常に/var/generation/
を空にしてください。それはあなたにたくさんの時間を節約します。
説明
テストの後、私は基礎となる原因を見つけました。初めてMagentoが自動的にファイルを生成するためにカスタムコントローラを実行するとき。ここまでは順調ですね。私の場合は1つだけです。それはvar\generation\
に住んでいますこの例のフルパスはvar\generation\Demo\Hello\Controller\Adminhtml\Order\MassPrint\Interceptor.php
です。
このクラスはカスタムコントローラを拡張しています。それでは、当然のことながら、それはそれ自身のコンサルケーションで親コンサルケーションを呼び出しています。そのため、コントローラコンストラクターを変更した場合、このファイルはあなたの新しいコードMachに再生成されなければなりません。そうでない場合は、不要な結果が得られます。それでは、少なくともそのコントローラのインターセプタクラスを削除してください。 Magentoはあなたの新しいコードに一致するすべてのファイルを再生成するようにディレクター全体を空にすることになります。
rm -rf var/generation/*
.
実際にMagentoは、エラーメッセージの最後の部分を調べるための非常に良い手がかりを与えます。
called in /var/generation/Demo/Hello/Controller/Adminhtml/Order/MassPrint/Interceptor.php on line 15
.