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.


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.


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 .


4

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


2

Apa yang berhasil bagi saya adalah menjalankan perintah kompilasi.

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

0

Di folder hapus magento 2.2:

"generated/code"

Dan itu akan menyelesaikan masalah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.