From d7dd6190211beadd2fb477afc402f89b28c050a7 Mon Sep 17 00:00:00 2001
From: Katherine Bailey <katherine@katbailey.net>
Date: Sat, 7 Jul 2012 12:57:46 -0700
Subject: [PATCH] Adding the config services to the container and removing the
 bootstrap_variables call from before the kernel boot, plus other minor
 adjustments

---
 core/includes/bootstrap.inc           |   7 +-
 core/lib/Drupal/Core/DrupalBundle.php |  31 +++++++
 core/lib/Drupal/Core/DrupalKernel.php | 112 ++++++++++++++------------
 index.php                             |   1 -
 4 files changed, 95 insertions(+), 56 deletions(-)

diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index c562039bdb83..ef42ceaafee1 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -2450,7 +2450,7 @@ function drupal_get_bootstrap_phase() {
  *   The instance of the Drupal Container used to set up and maintain object
  *   instances.
  */
-function drupal_container(ContainerBuilder $reset = NULL) {
+function drupal_container(Container $reset = NULL) {
   // We do not use drupal_static() here because we do not have a mechanism by
   // which to reinitialize the stored objects, so a drupal_static_reset() call
   // would leave Drupal in a nonfunctional state.
@@ -2460,14 +2460,13 @@ function drupal_container(ContainerBuilder $reset = NULL) {
   }
   elseif (!isset($container)) {
     // This will only ever happen if an error has been thrown. Just build a new
-    // ContainerBuilder with only the language_interface and language_content
-    // services.
+    // ContainerBuilder with only the language_interface service.
     $container = new ContainerBuilder();
+
     // An interface language always needs to be available for t() and other
     // functions. This default is overridden by drupal_language_initialize()
     // during language negotiation.
     $container->register(LANGUAGE_TYPE_INTERFACE, 'Drupal\\Core\\Language\\Language');
-    $container->register(LANGUAGE_TYPE_CONTENT, 'Drupal\\Core\\Language\\Language');
   }
   return $container;
 }
diff --git a/core/lib/Drupal/Core/DrupalBundle.php b/core/lib/Drupal/Core/DrupalBundle.php
index 30c074d9be4b..538ab1cce4a8 100644
--- a/core/lib/Drupal/Core/DrupalBundle.php
+++ b/core/lib/Drupal/Core/DrupalBundle.php
@@ -21,6 +21,7 @@ public function build(ContainerBuilder $container)
       $info += array(
         'tags' => array(),
         'references' => array(),
+        'parameters' => array(),
         'methods' => array(),
         'arguments' => array(),
       );
@@ -32,6 +33,11 @@ public function build(ContainerBuilder $container)
 
       $definition = new Definition($info['class'], $references);
 
+      foreach ($info['parameters'] as $key => $param) {
+        $container->setParameter($key, $param);
+        $definition->addArgument("%{$key}%");
+      }
+
       if (isset($info['factory_class']) && isset($info['factory_method'])) {
         $definition->setFactoryClass($info['factory_class']);
         $definition->setFactoryMethod($info['factory_method']);
@@ -63,6 +69,31 @@ public function build(ContainerBuilder $container)
    */
   function getDefinitions() {
     return array(
+      // Register configuration storage dispatcher.
+      'config.storage.dispatcher' => array(
+        'class' => 'Drupal\Core\Config\StorageDispatcher',
+        'parameters' => array(
+          'conifg.storage.info' => array(
+            'Drupal\Core\Config\DatabaseStorage' => array(
+              'connection' => 'default',
+              'target' => 'default',
+              'read' => TRUE,
+              'write' => TRUE,
+            ),
+            'Drupal\Core\Config\FileStorage' => array(
+              'directory' => config_get_config_directory(),
+              'read' => TRUE,
+              'write' => FALSE,
+            ),
+          ),
+        ),
+      ),
+      'config.factory' => array(
+        'class' => 'Drupal\Core\Config\ConfigFactory',
+        'references' => array(
+          'config.storage.dispatcher'
+        )
+      ),
       'dispatcher' => array(
         'class' => 'Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher',
         'references' => array(
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index f777e19f61bf..b9dbed0e75cf 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -18,63 +18,73 @@
  */
 class DrupalKernel extends Kernel {
 
-    public function registerBundles()
-    {
-        $bundles = array(
-            new DrupalBundle(),
-        );
-        $modules = array_keys(system_list('module_enabled'));
-        foreach ($modules as $module) {
-          $class = "\Drupal\{$module}\{$module}Bundle";
-          if (class_exists($class)) {
-            $bundles[] = new $class();
-          }
-        }
-        return $bundles;
-    }
+  public function registerBundles()
+  {
+    $bundles = array(
+      new DrupalBundle(),
+    );
 
+    // Rather than bootstrapping to a higher phase prior to booting the Kernel, which
+    // would ensure these files are loaded already, we want to boot the Kernel as
+    // early as possible in the bootstrapping phase.
+    // TODO: Somehow remove the necessity of calling system_list() to find out which
+    // bundles exist.
+    require_once DRUPAL_ROOT . '/core/includes/cache.inc';
+    require_once DRUPAL_ROOT . '/core/includes/module.inc';
+    require_once DRUPAL_ROOT . '/core/includes/database.inc';
 
-    /**
-     * Initializes the service container.
-     */
-    protected function initializeContainer()
-    {
-        $this->container = $this->buildContainer();
-        $this->container->set('kernel', $this);
-        drupal_container($this->container);
+    $modules = array_keys(system_list('module_enabled'));
+    foreach ($modules as $module) {
+      $class = "\Drupal\{$module}\{$module}Bundle";
+      if (class_exists($class)) {
+        $bundles[] = new $class();
+      }
     }
+    return $bundles;
+  }
 
-    /**
-     * Builds the service container.
-     *
-     * @return ContainerBuilder The compiled service container
-     */
-    protected function buildContainer()
-    {
-        $container = $this->getContainerBuilder();
-        foreach ($this->bundles as $bundle) {
-            $bundle->build($container);
-        }
-        $container->compile();
-        return $container;
-    }
 
+  /**
+   * Initializes the service container.
+   */
+  protected function initializeContainer()
+  {
+    $this->container = $this->buildContainer();
+    $this->container->set('kernel', $this);
+    drupal_container($this->container);
+  }
 
-    /**
-     * Gets a new ContainerBuilder instance used to build the service container.
-     *
-     * @return ContainerBuilder
-     */
-    protected function getContainerBuilder()
-    {
-        return new ContainerBuilder(new ParameterBag($this->getKernelParameters()));
+  /**
+   * Builds the service container.
+   *
+   * @return ContainerBuilder The compiled service container
+   */
+  protected function buildContainer()
+  {
+    $container = $this->getContainerBuilder();
+    foreach ($this->bundles as $bundle) {
+      $bundle->build($container);
     }
+    $container->compile();
+    return $container;
+  }
 
-    public function registerContainerConfiguration(LoaderInterface $loader)
-    {
-      // We have to define this method because it's not defined in the base class,
-      // but the LoaderInterface class is part of the config component, which we
-      // are not using, so this is badness :-/ The alternative is to not extend
-      // the base Kernel class and just implement the KernelInterface.
-    }
+
+  /**
+   * Gets a new ContainerBuilder instance used to build the service container.
+   *
+   * @return ContainerBuilder
+   */
+  protected function getContainerBuilder()
+  {
+    return new ContainerBuilder(new ParameterBag($this->getKernelParameters()));
+  }
+
+  public function registerContainerConfiguration(LoaderInterface $loader)
+  {
+    // We have to define this method because it's not defined in the base class
+    // but is part of the KernelInterface interface. However, the LoaderInterface
+    // class is part of the config component, which we are not using, so this
+    // is badness :-/
+  }
 }
diff --git a/index.php b/index.php
index 10e38af70954..df4b2b6a7838 100644
--- a/index.php
+++ b/index.php
@@ -21,7 +21,6 @@
 // Bootstrap the lowest level of what we need.
 require_once DRUPAL_ROOT . '/core/includes/bootstrap.inc';
 drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
-drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES);
 
 // Create a request object from the HTTPFoundation.
 $request = Request::createFromGlobals();
-- 
GitLab