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.

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top