Pourquoi ne puis-je pas injecter ProductRepositoryInterface dans Magento 2?

12

J'ai une action de contrôleur dans laquelle je voudrais injecter le référentiel produit

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

Peu importe l'ordre dans lequel je mets mes arguments de constructeur, l'injection de dépendance de Magento injecte toujours une classe non valide pour l' productRepositoryargument menant PHP à lancer et l'erreur d'argument. Le storeManagergetd s'injecta très bien. Vider les caches n'a pas aidé.

Voici l'exception levée:

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.

Les noms de classe et les positions des arguments dans le message d'erreur changent, mais la définition d'erreur est toujours la même. Le retrait ProductRepositoryInterfacedu constructeur rend tout à nouveau correct.

Mridang Agarwalla
la source
Re: "L'injection de dépendance de Magento injecte toujours une classe non valide pour l'argument productRepository" L'inclusion de l'erreur exacte aidera d'autres personnes à diagnostiquer le problème.
Alan Storm
1
avez-vous effacé var / generation?
Marius
@AlanStorm. Désolé pour ça. J'ai édité la question.
Mridang Agarwalla

Réponses:

18

Cela survient généralement lorsque vous ajoutez un autre paramètre au constructeur car Magento le met en cache dans var / generation. Vous devez effacer var / generation, ce qui oblige Magento à régénérer l'intercepteur.

Smartie
la source
Il semble que tu avais raison. J'ai effacé les caches de l'administrateur et cela n'a pas aidé.
Mridang Agarwalla
2
On dirait que dans la nouvelle installation, le dossier généré est dans la structure du dossier racine pas dans var, pourrait aider
xelber
J'ai créé un module personnalisé et j'essaye ce code dans la 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
Tout a toujours essayé de recevoir la même erreur. L' argument 4 transmis à Custom \ Module \ MagentoU \ Test :: __ construct () doit être une instance de Custom \ Module \ Api \ ProductRepositoryInterface, une instance de Magento \ Catalog \ Model \ ProductRepository \ Interceptor donnée
Ashwani Shukla
Courez php bin/magento setup:upgradeaprès
Black
4

C'est difficile à dire sans plus de détails, mais je vais supposer que l'exemple de code youe ressemble en fait à ceci

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

c'est-à-dire avec un espace de noms PHP (puisque tous les contrôleurs ont des espaces de noms dans Magento 2).

Si tel est le cas, dans votre exemple de code, vous essayez en fait d'injecter une Packagename\Module\Controller\ProductRepositoryInterfaceclasse. Si vous utilisez un nom de classe sans préfixe d'espace de noms, PHP suppose que vous voulez une classe dans l' espace de noms actuel .

Alan Storm
la source
4

Je n'ai pas pu injecter de module à un contrôleur avec ce message d'erreur. La suppression de var / generation a fonctionné pour moi ..

Mike Bahar
la source
2

Ce qui a fonctionné pour moi, c'est d'exécuter la commande de compilation.

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

Dans le dossier de suppression de magento 2.2:

"generated/code"

Et cela résoudra le problème.

jackcar
la source