Problem/Motivation

After installing the dev version of the String module (while upgrading a project to Drupal 11), I encountered the following fatal error:

"Circular reference detected for service 'entity_type.manager', path: 'easy_email.purger → entity_type.manager → string_translation → string_translator.string.defaults → plugin.manager.email_builder'."

Steps to reproduce

  1. Install Drupal CMS 1.1.0 (https://new.drupal.org/download)
  2. Install and enable String 1.0.x-dev.
  3. Install and enable Symfony Mailer (any version compatible with Drupal 11—I tried versions 1.5, 1.6, and 2.0).
  4. Clear the cache. The error appears.
  5. Disable any of the modules, clear the cache—the error disappears.

I'm not sure if this is an issue with the String module, as similar issues have been reported for Symfony Mailer and were already fixed:
Issue #3355846
Issue #3370109

Comments

anna d created an issue. See original summary.

d34dman’s picture

The following code $this->themeHandler->getThemeDirectories(); in a Plugin manager is calling \Drupal::service('config.factory')->get('core.extension') somewhere down the lane. This apparently is resulting in circular dependency error.

I have not yet figured out how the circular dependency is getting generator. However, doing something like $a = \Drupal::service('config.factory')->get('core.extension'); in https://git.drupalcode.org/project/string/-/blob/1.0.x/src/StringManager... results in this error.

Not sure what is happening here.

d34dman’s picture

Issue summary: View changes

d34dman credited chx.

d34dman’s picture

This can be reproduced only when clearing cache using Drush. The error appears during alternate invocation of cache clear using drush. Probably some cache issue.

Clearing cache using Drupal's User Interface doesn't have this issue.

d34dman’s picture

Update:
The problem appears when running `updb` as well

ddev drush updb --debug                                            
 [preflight] Config paths: /var/www/html/vendor/drush/drush/drush.yml
 [preflight] Alias paths: /var/www/html/web/drush/sites,/var/www/html/drush/sites
 [preflight] Commandfile search paths: /var/www/html/vendor/drush/drush/src
 [info] Starting bootstrap to full [1.15 sec, 3.27 MB]
 [info] Drush bootstrap phase 5 [1.16 sec, 3.27 MB]
 [info] Try to validate bootstrap phase 5 [1.16 sec, 3.27 MB]
 [info] Try to validate bootstrap phase 5 [1.16 sec, 3.27 MB]
 [info] Try to bootstrap at phase 5 [1.16 sec, 3.27 MB]
 [info] Drush bootstrap phase: bootstrapDrupalRoot() [1.16 sec, 3.27 MB]
 [info] Change working directory to /var/www/html/web [1.16 sec, 3.27 MB]
 [info] Initialized Drupal 10.4.6 root directory at /var/www/html/web [1.16 sec, 3.27 MB]
 [info] Try to validate bootstrap phase 5 [1.16 sec, 3.27 MB]
 [info] Try to bootstrap at phase 5 [1.16 sec, 3.39 MB]
 [info] Drush bootstrap phase: bootstrapDrupalSite() [1.16 sec, 3.39 MB]
 [debug] Could not find a Drush config file at sites/default/drush.yml. [1.16 sec, 3.5 MB]
 [info] Initialized Drupal site spar-lxp.ddev.site at sites/default [1.16 sec, 3.5 MB]
 [info] Try to validate bootstrap phase 5 [1.16 sec, 3.5 MB]
 [info] Try to bootstrap at phase 5 [1.16 sec, 3.5 MB]
 [info] Drush bootstrap phase: bootstrapDrupalConfiguration() [1.16 sec, 3.5 MB]
 [info] Try to validate bootstrap phase 5 [1.16 sec, 3.53 MB]
 [info] Try to bootstrap at phase 5 [1.18 sec, 3.68 MB]
 [info] Drush bootstrap phase: bootstrapDrupalDatabase() [1.18 sec, 3.68 MB]
 [info] Successfully connected to the Drupal database. [1.18 sec, 3.68 MB]
 [info] Try to validate bootstrap phase 5 [1.18 sec, 3.68 MB]
 [info] Try to bootstrap at phase 5 [1.18 sec, 3.68 MB]
 [info] Drush bootstrap phase: bootstrapDrupalFull() [1.18 sec, 3.68 MB]
 [debug] Start bootstrap of the Drupal Kernel. [1.18 sec, 3.68 MB]
 [debug] Get container builder [1.24 sec, 5.78 MB]
 [debug] Finished bootstrap of the Drupal Kernel. [1.81 sec, 16.01 MB]
 [debug] Loading drupal module drush commands & etc. [1.81 sec, 16.01 MB]
 [debug] Found drush.services.yml for default_content Drush commands [1.81 sec, 16.03 MB]
 [debug] Found drush.services.yml for key Drush commands [1.81 sec, 16.03 MB]
 [debug] Found drush.services.yml for token Drush commands [1.81 sec, 16.03 MB]
 [debug] Found drush.services.yml for ultimate_cron Drush commands [1.81 sec, 16.03 MB]
 [debug] Found drush.services.yml for votingapi Drush commands [1.81 sec, 16.03 MB]


In Container.php line 222:
                                                                                                                                            
  [Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException]                                                       
  Circular reference detected for service "entity_type.manager", path: "entity_field.manager -> entity_type.manager -> plugin.manager.emai  
  l_builder -> entity_type.manager".                                                                                                        
                                                                                                                                            

Exception trace:
  at /var/www/html/vendor/symfony/dependency-injection/Container.php:222
 Symfony\Component\DependencyInjection\Container::make() at /var/www/html/vendor/symfony/dependency-injection/Container.php:211
 Symfony\Component\DependencyInjection\Container->get() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:547
 Symfony\Component\DependencyInjection\ContainerBuilder->doGet() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1258
 Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1210
 Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1110
 Symfony\Component\DependencyInjection\ContainerBuilder->createService() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:586
 Symfony\Component\DependencyInjection\ContainerBuilder->doGet() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:531
 Symfony\Component\DependencyInjection\ContainerBuilder->get() at /var/www/html/web/core/lib/Drupal.php:197
 Drupal::service() at /var/www/html/web/modules/contrib/symfony_mailer/src/Processor/MailerConfigOverride.php:90
 Drupal\symfony_mailer\Processor\MailerConfigOverride->buildCache() at /var/www/html/web/modules/contrib/symfony_mailer/src/Processor/MailerConfigOverride.php:52
 Drupal\symfony_mailer\Processor\MailerConfigOverride->loadOverrides() at /var/www/html/web/core/lib/Drupal/Core/Config/ConfigFactory.php:209
 Drupal\Core\Config\ConfigFactory->loadOverrides() at /var/www/html/web/core/lib/Drupal/Core/Config/ConfigFactory.php:169
 Drupal\Core\Config\ConfigFactory->doLoadMultiple() at /var/www/html/web/core/lib/Drupal/Core/Config/ConfigFactory.php:104
 Drupal\Core\Config\ConfigFactory->doGet() at /var/www/html/web/core/lib/Drupal/Core/Config/ConfigFactory.php:89
 Drupal\Core\Config\ConfigFactory->get() at /var/www/html/web/core/lib/Drupal/Core/Extension/ThemeHandler.php:70
 Drupal\Core\Extension\ThemeHandler->listInfo() at /var/www/html/web/core/lib/Drupal/Core/Extension/ThemeHandler.php:161
 Drupal\Core\Extension\ThemeHandler->getThemeDirectories() at /var/www/html/web/modules/contrib/string/src/StringManager.php:77
 Drupal\string\StringManager->getDiscovery() at /var/www/html/web/modules/contrib/string/src/StringManager.php:137
 Drupal\string\StringManager->findDefinitions() at /var/www/html/web/core/lib/Drupal/Core/Plugin/DefaultPluginManager.php:213
 Drupal\Core\Plugin\DefaultPluginManager->getDefinitions() at /var/www/html/web/modules/contrib/string/src/Translator/StringTranslationDefaults.php:55
 Drupal\string\Translator\StringTranslationDefaults->getDefaultValues() at /var/www/html/web/modules/contrib/string/src/Translator/StringTranslationDefaults.php:44
 Drupal\string\Translator\StringTranslationDefaults->__construct() at n/a:n/a
 ReflectionClass->newInstanceArgs() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1140
 Symfony\Component\DependencyInjection\ContainerBuilder->createService() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:586
 Symfony\Component\DependencyInjection\ContainerBuilder->doGet() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1258
 Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1210
 Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1673
 Symfony\Component\DependencyInjection\ContainerBuilder->callMethod() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1166
 Symfony\Component\DependencyInjection\ContainerBuilder->createService() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:586
 Symfony\Component\DependencyInjection\ContainerBuilder->doGet() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1258
 Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1210
 Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1110
 Symfony\Component\DependencyInjection\ContainerBuilder->createService() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:586
 Symfony\Component\DependencyInjection\ContainerBuilder->doGet() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1258
 Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1210
 Symfony\Component\DependencyInjection\ContainerBuilder->doResolveServices() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:1110
 Symfony\Component\DependencyInjection\ContainerBuilder->createService() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:586
 Symfony\Component\DependencyInjection\ContainerBuilder->doGet() at /var/www/html/vendor/symfony/dependency-injection/ContainerBuilder.php:531
 Symfony\Component\DependencyInjection\ContainerBuilder->get() at /var/www/html/vendor/drush/drush/src/Runtime/LegacyServiceInstantiator.php:288
 Drush\Runtime\LegacyServiceInstantiator->resolveFromContainer() at /var/www/html/vendor/drush/drush/src/Runtime/LegacyServiceInstantiator.php:253
 Drush\Runtime\LegacyServiceInstantiator->resolveArgument() at n/a:n/a
 array_map() at /var/www/html/vendor/drush/drush/src/Runtime/LegacyServiceInstantiator.php:223
 Drush\Runtime\LegacyServiceInstantiator->resolveArguments() at /var/www/html/vendor/drush/drush/src/Runtime/LegacyServiceInstantiator.php:193
 Drush\Runtime\LegacyServiceInstantiator->instantiateObject() at /var/www/html/vendor/drush/drush/src/Runtime/LegacyServiceInstantiator.php:174
 Drush\Runtime\LegacyServiceInstantiator->create() at /var/www/html/vendor/drush/drush/src/Runtime/LegacyServiceInstantiator.php:128
 Drush\Runtime\LegacyServiceInstantiator->instantiateServices() at /var/www/html/vendor/drush/drush/src/Runtime/LegacyServiceInstantiator.php:60
 Drush\Runtime\LegacyServiceInstantiator->loadServiceFiles() at /var/www/html/vendor/drush/drush/src/Boot/DrupalBoot8.php:239
 Drush\Boot\DrupalBoot8->addDrupalModuleDrushCommands() at /var/www/html/vendor/drush/drush/src/Boot/DrupalBoot8.php:215
 Drush\Boot\DrupalBoot8->bootstrapDrupalFull() at /var/www/html/vendor/drush/drush/src/Boot/BootstrapManager.php:236
 Drush\Boot\BootstrapManager->doBootstrap() at /var/www/html/vendor/drush/drush/src/Boot/BootstrapManager.php:377
 Drush\Boot\BootstrapManager->bootstrapToPhaseIndex() at /var/www/html/vendor/drush/drush/src/Boot/BootstrapManager.php:329
 Drush\Boot\BootstrapManager->bootstrapToPhase() at /var/www/html/vendor/drush/drush/src/Boot/BootstrapHook.php:36
 Drush\Boot\BootstrapHook->initialize() at /var/www/html/vendor/consolidation/annotated-command/src/Hooks/Dispatchers/InitializeHookDispatcher.php:44
 Consolidation\AnnotatedCommand\Hooks\Dispatchers\InitializeHookDispatcher->doInitializeHook() at /var/www/html/vendor/consolidation/annotated-command/src/Hooks/Dispatchers/InitializeHookDispatcher.php:36
 Consolidation\AnnotatedCommand\Hooks\Dispatchers\InitializeHookDispatcher->callInitializeHook() at /var/www/html/vendor/consolidation/annotated-command/src/Hooks/Dispatchers/InitializeHookDispatcher.php:29
 Consolidation\AnnotatedCommand\Hooks\Dispatchers\InitializeHookDispatcher->initialize() at /var/www/html/vendor/consolidation/annotated-command/src/CommandProcessor.php:145
 Consolidation\AnnotatedCommand\CommandProcessor->initializeHook() at /var/www/html/vendor/consolidation/annotated-command/src/AnnotatedCommand.php:376
 Consolidation\AnnotatedCommand\AnnotatedCommand->initialize() at /var/www/html/vendor/symfony/console/Command/Command.php:292
 Symfony\Component\Console\Command\Command->run() at /var/www/html/vendor/symfony/console/Application.php:1096
 Symfony\Component\Console\Application->doRunCommand() at /var/www/html/vendor/symfony/console/Application.php:324
 Symfony\Component\Console\Application->doRun() at /var/www/html/vendor/symfony/console/Application.php:175
 Symfony\Component\Console\Application->run() at /var/www/html/vendor/drush/drush/src/Runtime/Runtime.php:110
 Drush\Runtime\Runtime->doRun() at /var/www/html/vendor/drush/drush/src/Runtime/Runtime.php:40
 Drush\Runtime\Runtime->run() at /var/www/html/vendor/drush/drush/drush.php:139
 require() at /var/www/html/vendor/drush/drush/drush:4
 include() at /var/www/html/vendor/bin/drush:119

This call seems to be causing the issue

 Drupal::service() at /var/www/html/web/modules/contrib/symfony_mailer/src/Processor/MailerConfigOverride.php:90

The code at
https://git.drupalcode.org/project/symfony_mailer/-/blob/1.x/src/Process...
indicates by using \Drupal::service, the circular dependency should have been avoided.

      // We cannot use dependency injection because that creates a circular
      // dependency.
      /** @var \Drupal\symfony_mailer\Processor\EmailBuilderManagerInterface $builderManager */
      $builderManager = \Drupal::service('plugin.manager.email_builder');
d34dman’s picture

Attaching a temporary fix for those who wan't to unblock themselves

  • d34dman committed f78038a7 on 1.1.x
    Issue #3514618: Apply temporary fix to avoid site crashing when circular...

  • d34dman committed f78038a7 on 1.x
    Issue #3514618: Apply temporary fix to avoid site crashing when circular...