Magento 2 - Менеджер объектов пытается создать экземпляр класса Abstract. ( Фатальная ошибка )

37

Играя с Magento 2, но столкнуться с проблемой, я не могу обернуть голову вокруг. Диспетчер объектов пытается создать экземпляр класса Abstract, что приводит к фатальной ошибке. Кто-то знает, что может вызвать это, или указывает мне правильное направление?

Ошибка

Fatal error: Cannot instantiate abstract class Magento\Framework\Model\Resource\AbstractResource in /lib/internal/Magento/Framework/ObjectManager/Factory/Dynamic/Developer.php on line 75

Проблема

Мой модуль имеет модель, которая расширяет \Magento\Quote\Model\Quote. Конструктор этой модели имеет следующую строку, вставляющую это:

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

Контроллер, который создает экземпляр модели, расширяет \Magento\Backend\App\Actionи использует ее $this->_objectManager->create()для создания экземпляра модели.

Я не могу обернуть голову, если я создаю экземпляр модели Magento, она просто работает, но если я создаю экземпляр моей модели, она пытается создать экземпляр этого абстрактного класса, выдавая ошибку выше. Что говорит менеджер объектов, чтобы сделать это и как я могу решить мою проблему?

Моей первой мыслью было, что Magento использует, di.xmlчтобы заменить это, выполнить это или что-то еще, но это не тот случай.

Спасибо, что нашли время, чтобы прочитать это. Любая помощь или вклад по этому вопросу приветствуется.

rofavadeka
источник
Вы можете разместить свой код в вопросе?
Мариус
Не могли бы вы быть более конкретным? Весь класс контроллера и конкретизированная модель огромны, и добавление их в вопрос не облегчает понимание первоначальной проблемы. Достаточно ли будет функции действия или конструктора?
рофавадека
Справедливо. Опубликуйте имя своего класса, что он расширяет, что он реализует и __constructметод вашей модели.
Мариус
По запросу :) верхняя часть модели. Я думаю, что у Криса есть решение, собираюсь проверить это и вернуться к вам. Спасибо Мариус.
рофавадека
Ага. Я думаю, что Крис понял это. :)
Мариус

Ответы:

109

Это может произойти, если ваш подкласс добавил новые зависимости после существующих необязательных зависимостей родительского класса.

Фрагмент от родителя

    \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
)}

Как код может изменить то, что необязательно

    \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
)}

Диспетчер объектов Magento 2 попытается ввести любые необходимые параметры. Так что это может произойти, если вы добавите обязательный параметр в конце конструктора.

Вы можете исправить это, переместив любой новый обязательный параметр выше необязательных.

Крис О'Тул
источник
1
Крис, ты заслужил огромное спасибо! Вы решили мою проблему большое время.
Рофавадека
И второе БОЛЬШОЕ СПАСИБО. Я люблю тебя, братан
Йонн Триморо
Решение @Chris, предоставленное вами, помогло мне, спасибо
Мукеш
Отличное объяснение!
Генри Буй
Моя проблема заключалась в том, что при использовании автозаполнения в phpStorm он также не смог принести с частью = null: /
OZZIE
0

Иногда какой-то модуль обновлялся, а ссылки в / сгенерированном еще не обновлялись.

Просто сделайте bin/magento setup:di:compileи попробуйте снова.

(У меня работало при обновлении платежного модуля и / checkout не загружался)

Рикардо Мартинс
источник