From d7dd6190211beadd2fb477afc402f89b28c050a7 Mon Sep 17 00:00:00 2001 From: Katherine Bailey 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 | 114 ++++++++++++++------------ index.php | 1 - 4 files changed, 96 insertions(+), 57 deletions(-) diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc index c562039bdb8..ef42ceaafee 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 30c074d9be4..538ab1cce4a 100644 --- a/core/lib/Drupal/Core/DrupalBundle.php +++ b/core/lib/Drupal/Core/DrupalBundle.php @@ -21,6 +21,7 @@ class DrupalBundle extends Bundle $info += array( 'tags' => array(), 'references' => array(), + 'parameters' => array(), 'methods' => array(), 'arguments' => array(), ); @@ -32,6 +33,11 @@ class DrupalBundle extends Bundle $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 @@ class DrupalBundle extends Bundle */ 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 f777e19f61b..b9dbed0e75c 100644 --- a/core/lib/Drupal/Core/DrupalKernel.php +++ b/core/lib/Drupal/Core/DrupalKernel.php @@ -18,63 +18,73 @@ use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; */ 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'; + + $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; + } - /** - * Initializes the service container. - */ - protected function initializeContainer() - { - $this->container = $this->buildContainer(); - $this->container->set('kernel', $this); - drupal_container($this->container); - } - - /** - * 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); + } + + /** + * 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; + } - /** - * Gets a new ContainerBuilder instance used to build the service container. - * - * @return ContainerBuilder - */ - protected function getContainerBuilder() - { - return new ContainerBuilder(new ParameterBag($this->getKernelParameters())); - } + /** + * 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 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. - } + 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 10e38af7095..df4b2b6a783 100644 --- a/index.php +++ b/index.php @@ -21,7 +21,6 @@ define('DRUPAL_ROOT', getcwd()); // 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();