为什么我不能在Magento 2中注入ProductRepositoryInterface?


12

我有一个控制器动作,我想将产品存储库注入其中

namespace Nosto\Tagging\Controller\Export;

use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Backend\App\Action;
use Magento\Framework\App\Action\Context;

class Test extends Action
{

    private $_productRepository;

    public function __construct(
        Context $context,
        StoreManagerInterface $storeManager,
        ProductRepositoryInterface $productRepository    
    ) {
        parent::__construct($context);
        $this->_storeManager = $storeManager;
        $this->_productRepository = $productRepository;
    }

无论我以什么顺序放置构造函数参数,Magento的依赖项注入总是为该productRepository参数注入一个无效的类,从而导致PHP抛出和参数错误。该storeManagerGETD注射就好了。清除缓存没有帮助。

这是引发的异常:

Recoverable Error: Argument 3 passed to Nosto\Tagging\Controller\Export\Test::__construct() must implement interface Magento\Catalog\Api\ProductRepositoryInterface, instance of Nosto\Tagging\Helper\Account given.

错误消息中的类名和参数位置会更改,但错误定义始终相同。ProductRepositoryInterface从构造函数中删除,可使一切再次正常。


回复:“ Magento的依赖项注入总是为productRepository参数注入一个无效的类”包括确切的错误将帮助其他人诊断问题。
艾伦·风暴

1
您清除了var / generation吗?
马吕斯

@AlanStorm。对于那个很抱歉。我已经编辑了问题。
Mridang Agarwalla'2

Answers:


18

当您向构造函数添加另一个参数时,通常会出现这种情况,因为Magento将其缓存在var / generation中。您需要清除var / generation,这会迫使Magento重新生成拦截器。


看来你是对的。我一直在从管理员清除缓存,但这没有帮助。
Mridang Agarwalla '16

2
看起来像是在新安装中,生成的文件夹不在var的根文件夹结构中,可能会有所帮助
xelber

我创建了一个自定义模块,并在Custom \ Module \ MagentoU \ Test类中尝试了此代码;public function __construct( \Magento\Catalog\Api\ProductRepositoryInterface $productRepository, \Magento\Catalog\Model\ProductFactory $productFactory, \Magento\Checkout\Model\Session $session, \Custom\Module\Api\ProductRepositoryInterface $unit1ProductRepository, array $data, $justAParameter = "" ) <preference for="Custom\Module\Api\ProductRepositoryInterface" type="Magento\Catalog\Model\ProductRepository" />
Ashwani Shukla,2017年

尝试一切仍然遇到相同的错误传递给Custom \ Module \ MagentoU \ Test :: __ construct()的参数4必须是Custom \ Module \ Api \ ProductRepositoryInterface的实例,Magento \ Catalog \ Model \ ProductRepository \ Interceptor的实例已给出
Ashwani Shukla

运行php bin/magento setup:upgrade后它
布莱克

4

没有更多细节很难说,但是我将假设您的代码示例实际上看起来像这样

namespace Packagename\Module\Controller;
class Test extends Action
{

    private $_productRepository;

    public function __construct(
        Context $context,
        StoreManagerInterface $storeManager,
        ProductRepositoryInterface $productRepository    
    ) {
        parent::__construct($context);
        $this->_storeManager = $storeManager;
        $this->_productRepository = $productRepository;
    }
}

即具有PHP名称空间(因为所有控制器在Magento 2中都具有名称空间)。

如果真是这样,那么在您的代码示例中,您实际上是在尝试注入一个Packagename\Module\Controller\ProductRepositoryInterface类。如果使用不带名称空间前缀的类名,则PHP会假定您想要当前名称空间中的类。



2

对我有用的是运行compile命令。

/ var / www / magento2-root $ php bin / magento setup:di:compile

0

在magento 2.2中删除文件夹:

"generated/code"

这样就可以解决问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.