diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php index b011271c0c7cdea7ac09899000321c61a1727fa3..ff728ad039d8081112b545b2071246fe3cf9ee0d 100644 --- a/core/lib/Drupal/Core/DrupalKernel.php +++ b/core/lib/Drupal/Core/DrupalKernel.php @@ -260,12 +260,7 @@ protected function getClassName() { * Initializes the service container. */ protected function initializeContainer() { - $persist = array(); - if (isset($this->container)) { - foreach ($this->container->getParameter('persistIds') as $id) { - $persist[$id] = $this->container->get($id); - } - } + $persist = $this->getServicesToPersist(); $this->container = NULL; $class = $this->getClassName(); $cache_file = $class . '.php'; @@ -279,6 +274,7 @@ protected function initializeContainer() { if (class_exists($class, FALSE)) { $fully_qualified_class_name = '\\' . $class; $this->container = new $fully_qualified_class_name; + $this->persistServices($persist); } } // First check whether the list of modules changed in this request. @@ -292,9 +288,6 @@ protected function initializeContainer() { // Second, check if some other request -- for example on another web // frontend or during the installer -- changed the list of enabled modules. if (isset($this->container)) { - foreach ($persist as $id => $object) { - $this->container->set($id, $object); - } // All namespaces must be registered before we attempt to use any service // from the container. $container_modules = $this->container->getParameter('container.modules'); @@ -306,6 +299,7 @@ protected function initializeContainer() { $this->moduleList = $this->container->get('config.factory')->get('system.module')->load()->get('enabled'); } if (array_keys($this->moduleList) !== array_keys($container_modules)) { + $persist = $this->getServicesToPersist(); unset($this->container); // Revert the class loader to its prior state. However, // registerNamespaces() performs a merge rather than replace, so to @@ -319,9 +313,7 @@ protected function initializeContainer() { if (!isset($this->container)) { $this->container = $this->buildContainer(); - foreach ($persist as $id => $object) { - $this->container->set($id, $object); - } + $this->persistServices($persist); if ($this->allowDumping) { $this->containerNeedsDumping = TRUE; } @@ -334,6 +326,35 @@ protected function initializeContainer() { drupal_container($this->container); } + /** + * Returns service instances to persist from an old container to a new one. + */ + protected function getServicesToPersist() { + $persist = array(); + if (isset($this->container)) { + foreach ($this->container->getParameter('persistIds') as $id) { + // It's pointless to persist services not yet initialized. + if ($this->container->initialized($id)) { + $persist[$id] = $this->container->get($id); + } + } + } + return $persist; + } + + /** + * Moves persistent service instances into a new container. + */ + protected function persistServices(array $persist) { + foreach ($persist as $id => $object) { + // Do not override services already set() on the new container, for + // example 'service_container'. + if (!$this->container->initialized($id)) { + $this->container->set($id, $object); + } + } + } + /** * Builds the service container. *