Magento 2, o gerenciador de objetos está passando outro objeto do que o esperado, por quê?
-
28-09-2020 - |
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).
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