Magento 2 - O gerenciador de objetos tenta instanciar a classe Abstract. ( Erro fatal )

37

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, isso gera um erro fatal. Alguém sabe o que pode causar isso ou me aponta na 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 possui um modelo que estende o \Magento\Quote\Model\Quote. O construtor deste modelo tem a seguinte linha injetando isso:

\Magento\Framework\Model\Resource\AbstractResource $resource = null,.

O controlador que está instanciando o modelo estende \Magento\Backend\App\Actione usa $this->_objectManager->create()para instanciar o modelo.

O que eu 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, lançando o erro acima. O que instrui o gerenciador de objetos a fazer isso e como posso resolver meu problema?

Meu primeiro pensamento foi que o Magento usa o di.xmlpara substituir isso, executar isso ou algo assim, esse não era o caso.

Obrigado por tomar o tempo para ler este. Qualquer ajuda ou contribuição sobre este assunto é apreciada.

rofavadeka
fonte
você pode postar seu código na pergunta?
Marius
Você poderia ser um pouco mais específico? A classe inteira do controlador e o modelo instanciado são enormes, e adicioná-los à pergunta não facilita a compreensão do problema inicial. A ação funcionará ou o construtor será suficiente?
Rfavadeka
Justo. Poste o nome da sua classe, o que ela estende, o que implementa e o __constructmétodo do seu modelo.
Marius
Conforme solicitado :) a parte superior do modelo. Acho que Chris tem a solução, vai testar isso e voltar para você. Obrigado Marius.
Rfavadeka
Sim. Eu acho que Chris entendeu. :)
Marius

Respostas:

109

Isso pode acontecer se sua subclasse tiver adicionado novas dependências após as dependências opcionais existentes da classe pai.

Snippet 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 os parâmetros necessários. Portanto, isso pode acontecer se você adicionar um parâmetro necessário no final do construtor.

Você pode corrigir isso movendo qualquer novo parâmetro necessário acima dos opcionais.

Chris O'Toole
fonte
11
Chris, você ganhou um enorme obrigado! Você resolveu o meu problema grande momento.
Rofavadeka
E um segundo GRANDE OBRIGADO. Eu te amo, mano
Yonn Trimoreau
@ Chris solução fornecido por você me ajudou, graças
Mukesh
Ótima explicação!
Henry Bui
Meu problema era que, ao usar auto-completar em phpStorm não conseguiu também trazer com a = parte nulo: /
OZZIE
0

Às vezes, algum módulo foi atualizado e as referências em / geradas ainda não foram atualizadas.

Basta fazer um bin/magento setup:di:compilee tente novamente.

(Funcionou para mim ao atualizar um módulo de pagamento e / o checkout não foi carregado)

Ricardo Martins
fonte