Pergunta

Justamente quando penso que compreendo o gerenciador de objetos do Magento 2 e a injeção de dependência, acontece algo que não entendo.acho que estou passando context pt pagefactory objetos, mas Magento diz que não.O segundo parece errado.

Recoverable Error: Argument 2 passed to Demo\Hello\Controller\Adminhtml\Order\MassPrint::__construct() must be an instance of Magento\Framework\View\Result\PageFactory, instance of Magento\Framework\App\ResourceConnection given, called in 

O controlador:

<?php 
namespace Demo\Hello\Controller\Adminhtml\Order;

use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;

class MassPrint extends \Magento\Backend\App\Action {

  public function __construct(Context $context, PageFactory $pageFactory) {
    parent::__construct($context);
  }

}

Ele entende a sugestão de tipo como eu quero:

must be an instance of Magento\Framework\View\Result\PageFactory

Mas está passando

instance of Magento\Framework\App\ResourceConnection given

Por que é isso?Há alguma mágica acontecendo com o Magento que eu não entendo (ainda).

Foi útil?

Solução

DR

Se você vir um erro com Interceptor.php certifique-se de esvaziar /var/generation/ antes de olhar mais longe.Isso economizará muito tempo.

Explicação

Depois de alguns testes, encontrei a causa subjacente.Ao executar um controlador personalizado pela primeira vez, o Magento gera arquivos automaticamente.Até agora tudo bem.No meu caso, apenas um.Está morando em var\generation\ O caminho completo neste exemplo seria var\generation\Demo\Hello\Controller\Adminhtml\Order\MassPrint\Interceptor.php.

Esta classe está estendendo seu controlador personalizado.Então, naturalmente, ele chama o construtor pai em seu próprio construtor.Portanto, se você fizer alterações no construtor do controlador, esse arquivo deverá ser regenerado para gerar seu novo código.Se você não fizer isso, produzirá resultados indesejados.Portanto, certifique-se de excluir pelo menos a classe Interceptor desse controlador.Mais fácil seria esvaziar todo o diretor para que o Magento regenerasse todos os arquivos correspondentes ao seu novo código.

rm -rf var/generation/*

Na verdade, o magento dá uma boa pista de onde procurar na última parte da mensagem de erro.

called in /var/generation/Demo/Hello/Controller/Adminhtml/Order/MassPrint/Interceptor.php on line 15
Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top