Mengapa saya tidak bisa menyuntikkan ProductRepositoryInterface di Magento 2?

12

Saya memiliki aksi pengontrol di mana saya ingin menyuntikkan repositori-produk

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;
    }

Tidak peduli urutan apa pun yang saya tempatkan argumen konstruktor saya, ketergantungan-injeksi Magento selalu menyuntikkan kelas yang tidak valid untuk productRepositoryargumen yang menyebabkan PHP untuk melempar dan kesalahan argumen. The storeManagergetd disuntikkan baik-baik saja. Membersihkan cache tidak membantu.

Inilah pengecualian yang dilemparkan:

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.

Nama kelas dan posisi argumen dalam pesan kesalahan berubah tetapi definisi kesalahan selalu sama. Menghapus ProductRepositoryInterfacedari konstruktor membuat semuanya baik kembali.

Mridang Agarwalla
sumber
Re: "Injeksi ketergantungan Magento selalu menyuntikkan kelas yang tidak valid untuk argumen productRepository" Termasuk kesalahan yang tepat akan membantu orang lain mendiagnosis masalah.
Alan Storm
1
apakah Anda menghapus var / generasi?
Marius
@AlanStorm. Maaf soal itu. Saya telah mengedit pertanyaan.
Mridang Agarwalla

Jawaban:

18

Ini biasanya muncul ketika Anda menambahkan parameter lain ke konstruktor karena Magento menyimpannya dalam var / generation. Anda perlu menghapus var / generasi yang memaksa Magento untuk membuat ulang interceptor.

Smartie
sumber
Tampaknya Anda benar. Saya telah membersihkan cache dari admin dan itu tidak membantu.
Mridang Agarwalla
2
Sepertinya dalam instalasi baru, folder yang dihasilkan dalam struktur folder root tidak dalam var, mungkin membantu
xelber
Saya telah membuat modul khusus dan mencoba kode ini di dalam kelas 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
Mencoba semuanya masih mendapatkan kesalahan yang sama Argumen 4 diteruskan ke Custom \ Module \ MagentoU \ Test :: __ construct () harus merupakan instance dari Custom \ Module \ Api \ ProductRepositoryInterface, instance dari Magento \ Catalog \ Model \ ProductRepository \ Interceptor diberikan
Ashwani Shukla
Jalankan php bin/magento setup:upgradesetelahnya
Black
4

Sulit untuk mengatakan tanpa rincian lebih lanjut, tetapi saya akan menganggap Anda sampel kode benar-benar terlihat seperti ini

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;
    }
}

yaitu dengan namespace PHP (karena semua pengontrol memiliki ruang nama di Magento 2).

Jika itu masalahnya, maka dalam sampel kode Anda, Anda benar-benar mencoba menyuntikkan Packagename\Module\Controller\ProductRepositoryInterfacekelas. Jika Anda menggunakan nama kelas tanpa awalan namespace, PHP menganggap Anda menginginkan kelas di namespace saat ini .

Alan Storm
sumber
4

Saya tidak dapat menyuntikkan modul apa pun ke controller dengan pesan kesalahan ini. Menghapus var / generasi bekerja untuk saya ..

Mike Bahar
sumber
2

Apa yang berhasil bagi saya adalah menjalankan perintah kompilasi.

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

Di folder hapus magento 2.2:

"generated/code"

Dan itu akan menyelesaikan masalah.

jackcar
sumber