Magento 2,对象管理器正在传递另一个预期的对象,为什么?
-
28-09-2020 - |
题
正当我认为我掌握了 Magento 2 对象管理器和依赖注入时,发生了一些我不明白的事情。我想我正在通过 context
zh pagefactory
反对,但 Magento 说我不是。第二个好像不对。
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
为什么是这样?Magento 有一些我还不明白的魔力。
解决方案
长话短说
如果您看到错误 Interceptor.php
一定要清空 /var/generation/
在您进一步查看之前。这将为您节省大量时间。
解释
经过一些测试,我找到了根本原因。第一次执行自定义控制器时,Magento 会自动生成文件。到目前为止,一切都很好。就我而言,只有一个。它生活在 var\generation\
本例中的完整路径是 var\generation\Demo\Hello\Controller\Adminhtml\Order\MassPrint\Interceptor.php
.
此类正在扩展您的自定义控制器。所以很自然地,它会在自己的构造函数中调用父构造函数。因此,如果您对控制器构造函数进行更改,则必须重新生成此文件以匹配您的新代码。如果不这样做,将会产生不需要的结果。因此,请确保至少删除该控制器的 Interceptor 类。更简单的方法是清空整个目录,这样 Magento 将重新生成与您的新代码匹配的所有文件。
rm -rf var/generation/*
实际上,magento 给出了在错误消息的最后部分中查找位置的非常好的线索。
called in /var/generation/Demo/Hello/Controller/Adminhtml/Order/MassPrint/Interceptor.php on line 15