Magento 2 - Gerenciador de objetos tenta instanciar a classe Abstract.( Erro fatal )
-
13-12-2019 - |
Pergunta
Brincando com o Magento 2, mas me deparei com um problema que não consigo entender.O gerenciador de objetos tenta instanciar a classe Abstract, o que gera um erro fatal.Alguém sabe o que pode causar isso ou me indicar a direção certa?
O erro
Fatal error: Cannot instantiate abstract class Magento\Framework\Model\Resource\AbstractResource in /lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php on line 75
O problema
Meu módulo tem um modelo que estende o \Magento\Quote\Model\Quote
.O construtor deste modelo possui a seguinte linha injetando isso:
\Magento\Framework\Model\Resource\AbstractResource $resource = null,
.
O controlador que está instanciando o modelo estende o \Magento\Backend\App\Action
e usa $this->_objectManager->create()
para instanciar o modelo.
O que não consigo entender é que se eu instanciar o modelo Magento, ele simplesmente funciona, mas se eu instanciar meu modelo, ele tenta instanciar essa classe abstrata, gerando o erro acima.O que diz ao gerenciador de objetos para fazer isso e como posso resolver meu problema?
Meu primeiro pensamento foi que Magento usa o di.xml
para substituir isso, executar isso ou algo assim, não foi o caso.
Obrigado por tomar o tempo para ler este.Qualquer ajuda ou contribuição sobre este assunto é apreciada.
Solução
Isso pode acontecer se sua subclasse adicionou novas dependências após as dependências opcionais existentes da classe pai.
Trecho do pai
\Magento\Quote\Model\Cart\CurrencyFactory $currencyFactory, // required
JoinProcessorInterface $extensionAttributesJoinProcessor, // required
\Magento\Framework\Model\Resource\AbstractResource $resource = null, //optional
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, //optional
array $data = [] //optional
)}
Como o código pode alterar o que é opcional
\Magento\Quote\Model\Cart\CurrencyFactory $currencyFactory, // required
JoinProcessorInterface $extensionAttributesJoinProcessor, // required
\Magento\Framework\Model\Resource\AbstractResource $resource = null, // required (even though it has a default value, because it is followed by parameters that don't have default values)
int $x, // required
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, // optional (still optional because there are no required parameters following it)
array $data = [] // optional
)}
O Magento 2 Object Manager tentará injetar quaisquer parâmetros necessários.Portanto, isso poderia acontecer se você adicionasse um parâmetro obrigatório no final do construtor.
Você pode corrigir isso movendo qualquer novo parâmetro obrigatório acima dos opcionais.
Outras dicas
Às vezes, algum módulo foi atualizado e as referências em /generated ainda não foram atualizadas.
Basta fazer um bin/magento setup:di:compile
e tente novamente.
(Funcionou para mim ao atualizar um módulo de pagamento e/checkout não carregou)