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の依存関係注入は、productRepositoryPHPがスローする引数および引数エラーに対して常に無効なクラスを挿入します。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コンストラクタからを削除すると、すべてが再び正常になります。


Re:「Magentoの依存関係注入は、常にproductRepository引数に無効なクラスを注入します」正確なエラーを含めると、他の人が問題を診断するのに役立ちます。
アランストーム

1
var / generationをクリアしましたか?
マリウス

@AlanStorm。ごめんなさい 質問を編集しました。
ムリダンアガルワラ16

回答:


18

これは、Magentoがvar / generationにキャッシュするため、コンストラクターに別のパラメーターを追加すると一般的に発生します。Magentoにインターセプターを再生成させるvar / generationをクリアする必要があります。


あなたは正しかったようです。私は管理者からキャッシュをクリアしてきましたが、助けにはなりませんでした。
ムリダンアガルワラ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" />
アシュワニシュクラ

まだ同じエラーになっすべて試したカスタム\モジュール\ MagentoU \テストに渡される引数4 :: __構築物()カスタム\モジュール\アピ\ ProductRepositoryInterface、Magentoの\カタログのインスタンスのインスタンスでなければなりませんが、\与えられたモデル\ ProductRepository \インターセプタ
Ashwaniシュクラ

実行しphp bin/magento setup:upgradeて後
ブラック

4

詳細なしに言うのは難しいですが、youeコードサンプルが実際に次のよう見えると仮定します。

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は現在の名前空間にクラスが必要であると想定します。


4

このエラーメッセージでコントローラーにモジュールを挿入できませんでした。var / generationを削除するとうまくいきました。


2

私のために働いたのは、コンパイルコマンドを実行していることです。

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

0

magento 2.2でフォルダーを削除します。

"generated/code"

そして、それは問題を解決します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.