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 productRepository
argumento que leva o PHP a lançar e erro de argumento. O storeManager
getd 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 ProductRepositoryInterface
do construtor torna tudo bem novamente.
magento2
controllers
dependency-injection
action
Mridang Agarwalla
fonte
fonte
Respostas:
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.
fonte
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" />
php bin/magento setup:upgrade
após eleÉ difícil dizer sem mais detalhes, mas vou assumir que o exemplo de código é realmente algo como isto
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\ProductRepositoryInterface
classe. 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 .fonte
Não pude injetar nenhum módulo em um controlador com essa mensagem de erro. Excluir var / generation funcionou para mim ..
fonte
O que funcionou para mim é executar o comando compile.
fonte
No magento 2.2 delete folder:
E isso resolverá o problema.
fonte