Ошибка DependencyInjection

Главные вкладки

Аватар пользователя ivkoles23 ivkoles23 23 апреля в 16:56

При попутке удалить модуль через drush (drush pm:uninstall моймодуль) вылезает ошибка:

PHP Fatal error: Uncaught Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException: Circular reference detected for service "entity_type.manager", path: "user_last_access_subscriber -> entity_type.manager -> string_translation -> string_translator.locale.lookup -> config.factory -> set_front_page.overrider -> set_front_page.manager". in /home/users/.../.........../domains/mysite.ru/web/core/lib/Drupal/Component/DependencyInjection/Container.php:147

содержимое этой 147 строки:
if (isset($this->loading[$id])) { throw new ServiceCircularReferenceException($id, array_keys($this->loading)); }

В чем может быть проблема? Как лечить?

Комментарии

Аватар пользователя marassa marassa 23 апреля в 21:52

ivkoles23 wrote: При попутке удалить модуль через drush (drush pm:uninstall моймодуль) вылезает ошибка:

Ключ к решению скорее всего лежит в файле моймодуль.install.

Аватар пользователя gun_dose gun_dose 24 апреля в 10:31

Если это при удалении вашего модуля, то смотрите конструкторы и методы create в ваших сервисах и классах, где используется Dependency Injection: плагинах, формах, контроллерах. Самая частая причина такого поведения - это вызов метода getStorage сервиса entityTypeManager в конструкторах или create. Способ решения - никогда не использовать entityStorage как свойство класса. Нужно в свойство класса назначать entityTypeManager, а storage получать по месту.
Кроме того, причиной может быть инициализация экземпляра плагина в конструкторе.

Аватар пользователя ivkoles23 ivkoles23 24 апреля в 10:38

Спасибо большое, за помощь.
Но я, в общем, никуда особо и не лазил в php. Все настраивал из админки. Разве что пару твигов поправил, по дизайну.

Аватар пользователя gun_dose gun_dose 24 апреля в 11:47
1

Ясно, значит эта проблема где-то в контрибных модулях. К слову, в том модуле, о котором говорил Йура, проблема также была в getStorage в конструкторе.
Если вы плохо разбираетесь в php, то тут есть несколько вариантов. Первый, проверить, отключился ли всё-таки модуль. Часто бывает такое, что несмотря на ошибку модуль всё же выключается и после сброса кэша всё работает.
Если не помогло, то надо искать в файлах контрибных модулей вызов метода getStorage и смотреть, где он вызывается внутри методов __construct или create. Можно попробовать закомментировать строку и снова попробовать удалить модуль, а потом вернуть всё, как было.

Аватар пользователя ivkoles23 ivkoles23 24 апреля в 15:34
1

Удалил несколько неиспользуемых модулей с помощью Composer + почистил drush config:delete core.extension module.моймодуль.
И всё заработало.
Благодарю еще раз вас - jura12 и gun_dose.