Magento 2 - Менеджер об'єктів намагається створити клас абстрактних. ( Фатальна помилка )


37

Граючи з Magento 2, але зіткнувшись з проблемою, я не можу обернути голову. Менеджер об'єктів намагається інстанціювати абстрактний клас, це дає Fatal Error. Хтось знає, що може спричинити це чи вказати мене в правильному напрямку?

Помилка

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 використовує the, di.xmlщоб замінити це, виконати те чи інше, це було не так.

Дякуємо, що знайшли час, щоб прочитати це. Будь-яка допомога або вклад у цьому питанні вдячна.


чи можете ви розмістити свій код у питанні?
Маріус

Чи можете ви бути трохи більш конкретним? Весь клас контролера та інстанціональна модель величезні, і додавання їх до запитання не полегшує розуміння початкової проблеми. Чи буде достатньо функціонування чи конструктора?
rofavadeka

Досить справедливо. Опублікуйте назву свого класу, що він розширює, що він реалізує та __constructметод вашої моделі.
Маріус

Як вимагається :) верхня частина моделі. Я думаю, у Кріса є рішення, збираючись перевірити це і повернутися до вас. Спасибі Маріус
rofavadeka

Так. Я думаю, Кріс це отримав. :)
Маріус

Відповіді:


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
Кріс, ти заробив величезну подяку! Ви вирішили мою проблему великим часом.
rofavadeka

І другий ВЕЛИКИЙ ДЯКУЮ ВАС. Я люблю тебе брате
Йонн Триморе

@Chris рішення, яке ви надали, допомогло мені, спасибі
Mukesh

Чудове пояснення!
Генрі Буй

Моя проблема полягала в тому, що при використанні функції автоматичного завершення в phpStorm не вдалося також привести з = null частину: /
OZZIE

0

Іноді деякий модуль оновлювався, а посилання під / згенерованими ще не оновлювалися.

Просто зробіть bin/magento setup:di:compileі спробуйте ще раз.

(Для мене працювали, коли оновлення платіжного модуля та / каси не завантажувалось)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.