Por que não posso injetar o ProductRepositoryInterface no Magento 2?

12

Eu tenho uma ação de controlador na qual gostaria de injetar o repositório do produto

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

Não importa em que ordem eu coloquei meus argumentos de construtor, a injeção de dependência do Magento sempre injeta uma classe inválida para o productRepositoryargumento que leva o PHP a lançar e erro de argumento. O storeManagergetd injetou muito bem. Limpar os caches não ajudou.

Aqui está a exceção lançada:

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.

Os nomes de classe e posições de argumento na mensagem de erro mudam, mas a definição de erro é sempre a mesma. A remoção ProductRepositoryInterfacedo construtor torna tudo bem novamente.

Mridang Agarwalla
fonte
Re: "A injeção de dependência do Magento sempre injeta uma classe inválida para o argumento productRepository" A inclusão do erro exato ajudará outras pessoas a diagnosticar o problema.
Alan Storm
1
você limpou var / generation?
Marius
@AlanStorm. Me desculpe por isso. Eu editei a pergunta.
Mridang Agarwalla

Respostas:

18

Isso geralmente surge quando você adiciona outro parâmetro ao construtor porque o Magento o armazena em cache em var / generation. Você precisa limpar var / generation, o que força o Magento a regenerar o interceptador.

Smartie
fonte
Parece que você estava certo. Estive limpando os caches do administrador e isso não ajudou.
Mridang Agarwalla
2
Looks como na nova instalação, pasta gerada é na estrutura da pasta raiz não em var, poderia ajudar
xelber
Eu criei um módulo personalizado e tentei esse código na 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 7/11
Tentei tudo ainda com o mesmo erro O argumento 4 passado para Custom \ Module \ MagentoU \ Test :: __ construct () deve ser uma instância de Custom \ Module \ Api \ ProductRepositoryInterface, instância do Magento \ Catalog \ Model \ ProductRepository \ Interceptor fornecida
Ashwani Shukla
Executar php bin/magento setup:upgradeapós ele
preto
4

É difícil dizer sem mais detalhes, mas vou assumir que o exemplo de código é realmente algo como isto

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

isto é, com um espaço para nome PHP (já que todos os controladores têm espaços para nome no Magento 2).

Se for esse o caso, no seu exemplo de código você está realmente tentando injetar uma Packagename\Module\Controller\ProductRepositoryInterfaceclasse. Se você usar um nome de classe sem um prefixo de espaço para nome, o PHP assumirá que você deseja uma classe no espaço para nome atual .

Alan Storm
fonte
4

Não pude injetar nenhum módulo em um controlador com essa mensagem de erro. Excluir var / generation funcionou para mim ..

Mike Bahar
fonte
2

O que funcionou para mim é executar o comando compile.

/ var / www / magento2-root $ php bin / configuração do magento: di: compile
dvarney
fonte
0

No magento 2.2 delete folder:

"generated/code"

E isso resolverá o problema.

jackcar
fonte