正当我认为我掌握了 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
许可以下: CC-BY-SA归因
scroll top