Perché non riesco a iniettare l'interfaccia ProductRepository in Magento 2?


12

Ho un'azione del controller in cui vorrei iniettare il repository del prodotto

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

Indipendentemente dall'ordine in cui inserisco i miei argomenti del costruttore, l'iniezione di dipendenza di Magento inietta sempre una classe non valida per l' productRepositoryargomento che porta PHP a lanciare e l'errore dell'argomento. Il storeManagergetd ha iniettato bene. Svuotare le cache non ha aiutato.

Ecco l'eccezione generata:

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.

I nomi delle classi e le posizioni degli argomenti nel messaggio di errore cambiano ma la definizione dell'errore è sempre la stessa. La rimozione di ProductRepositoryInterfacedal costruttore rende di nuovo tutto a posto.


Ri: "L'iniezione di dipendenza di Magento inietta sempre una classe non valida per l'argomento productRepository" Includere l'errore esatto aiuterà altre persone a diagnosticare il problema.
Alan Storm,

1
hai cancellato var / generazione?
Marius

@AlanStorm. Mi dispiace per quello. Ho modificato la domanda.
Mridang Agarwalla,

Risposte:


18

Questo generalmente si verifica quando aggiungi un altro parametro al costruttore perché Magento lo memorizza nella cache in var / generation. È necessario cancellare var / generation che forza Magento a rigenerare l'intercettore.


Sembra che tu avessi ragione. Ho cancellato la cache dall'amministratore e questo non mi ha aiutato.
Mridang Agarwalla,

2
Sembra che nella nuova installazione, la cartella generata sia nella struttura della cartella principale non in var, potrebbe aiutare
xelber

Ho creato un modulo personalizzato e provando questo codice all'interno della classe 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,

Ho provato tutto ottenendo lo stesso errore Argomento 4 passato a Custom \ Module \ MagentoU \ Test :: __ construct () deve essere un'istanza di Custom \ Module \ Api \ ProductRepositoryInterface, istanza di Magento \ Catalog \ Model \ ProductRepository \ Interceptor fornita
Ashwani Shukla,

Corri php bin/magento setup:upgradedietro
Black

4

È difficile da dire senza ulteriori dettagli, ma suppongo che il tuo esempio di codice in realtà assomigli a questo

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

cioè con uno spazio dei nomi PHP (poiché tutti i controller hanno spazi dei nomi in Magento 2).

In tal caso, nell'esempio di codice stai effettivamente cercando di iniettare una Packagename\Module\Controller\ProductRepositoryInterfaceclasse. Se usi un nome di classe senza un prefisso dello spazio dei nomi, PHP assume che tu voglia una classe nello spazio dei nomi corrente .


4

Non sono stato in grado di iniettare alcun modulo in un controller con questo messaggio di errore. L'eliminazione di var / generation ha funzionato per me ..


2

Ciò che ha funzionato per me è l'esecuzione del comando di compilazione.

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

0

In magento 2.2 elimina cartella:

"generated/code"

E questo risolverà il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.