diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc index 6fae299..ed82b78 100644 --- a/core/includes/bootstrap.inc +++ b/core/includes/bootstrap.inc @@ -10,6 +10,7 @@ use Drupal\Component\Utility\SafeMarkup; use Drupal\Component\Utility\String; use Drupal\Component\Utility\Unicode; +use Drupal\Core\DependencyInjection\ContainerNotInitializedException; use Drupal\Core\DrupalKernel; use Drupal\Core\Extension\ExtensionDiscovery; use Drupal\Core\Logger\RfcLogLevel; @@ -733,7 +734,13 @@ function drupal_bootstrap($phase = NULL) { $boot_level = $phase; } - return \Drupal::getContainer() ? DRUPAL_BOOTSTRAP_CODE : DRUPAL_BOOTSTRAP_CONFIGURATION; + try { + \Drupal::getContainer(); + return DRUPAL_BOOTSTRAP_CODE; + } + catch (ContainerNotInitializedException $e) { + return DRUPAL_BOOTSTRAP_CONFIGURATION; + } } /** diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php index 7b52d13..f1c9771 100644 --- a/core/lib/Drupal.php +++ b/core/lib/Drupal.php @@ -5,6 +5,7 @@ * Contains Drupal. */ +use Drupal\Core\DependencyInjection\ContainerNotInitializedException; use Symfony\Component\DependencyInjection\ContainerInterface; use Drupal\Core\Url; @@ -103,15 +104,20 @@ class Drupal { * Sets a new global container. * * @param \Symfony\Component\DependencyInjection\ContainerInterface $container - * A new container instance to replace the current. NULL may be passed by - * testing frameworks to ensure that the global state of a previous - * environment does not leak into a test. + * A new container instance to replace the current. */ - public static function setContainer(ContainerInterface $container = NULL) { + public static function setContainer(ContainerInterface $container) { static::$container = $container; } /** + * Unsets the global container. + */ + public static function unsetContainer() { + static::$container = NULL; + } + + /** * Returns the currently active global container. * * @deprecated This method is only useful for the testing environment. It @@ -120,6 +126,11 @@ public static function setContainer(ContainerInterface $container = NULL) { * @return \Symfony\Component\DependencyInjection\ContainerInterface|null */ public static function getContainer() { + // @todo Currently drush depends on this method returning NULL if not + // initialized. Once drush is fixed, remove the PHP_SAPI check. + if (static::$container === NULL && PHP_SAPI !== 'cli') { + throw new ContainerNotInitializedException('\Drupal::$container is not initialized yet. \Drupal::setContainer() must be called with a real container.'); + } return static::$container; } @@ -136,7 +147,7 @@ public static function getContainer() { * The specified service. */ public static function service($id) { - return static::$container->get($id); + return static::getContainer()->get($id); } /** @@ -149,7 +160,7 @@ public static function service($id) { * TRUE if the specified service exists, FALSE otherwise. */ public static function hasService($id) { - return static::$container && static::$container->has($id); + return static::getContainer()->has($id); } /** @@ -158,7 +169,7 @@ public static function hasService($id) { * @return string */ public static function root() { - return static::$container->get('app.root'); + return static::getContainer()->get('app.root'); } /** @@ -168,7 +179,7 @@ public static function root() { * TRUE if there is a currently active request object, FALSE otherwise. */ public static function hasRequest() { - return static::$container && static::$container->has('request_stack') && static::$container->get('request_stack')->getCurrentRequest() !== NULL; + return static::getContainer()->has('request_stack') && static::getContainer()->get('request_stack')->getCurrentRequest() !== NULL; } /** @@ -194,7 +205,7 @@ public static function hasRequest() { * The currently active request object. */ public static function request() { - return static::$container->get('request_stack')->getCurrentRequest(); + return static::getContainer()->get('request_stack')->getCurrentRequest(); } /** @@ -204,7 +215,7 @@ public static function request() { * The request stack */ public static function requestStack() { - return static::$container->get('request_stack'); + return static::getContainer()->get('request_stack'); } /** @@ -214,7 +225,7 @@ public static function requestStack() { * The currently active route match object. */ public static function routeMatch() { - return static::$container->get('current_route_match'); + return static::getContainer()->get('current_route_match'); } /** @@ -223,7 +234,7 @@ public static function routeMatch() { * @return \Drupal\Core\Session\AccountProxyInterface */ public static function currentUser() { - return static::$container->get('current_user'); + return static::getContainer()->get('current_user'); } /** @@ -233,7 +244,7 @@ public static function currentUser() { * The entity manager service. */ public static function entityManager() { - return static::$container->get('entity.manager'); + return static::getContainer()->get('entity.manager'); } /** @@ -243,7 +254,7 @@ public static function entityManager() { * The current active database's master connection. */ public static function database() { - return static::$container->get('database'); + return static::getContainer()->get('database'); } /** @@ -259,7 +270,7 @@ public static function database() { * @ingroup cache */ public static function cache($bin = 'default') { - return static::$container->get('cache.' . $bin); + return static::getContainer()->get('cache.' . $bin); } /** @@ -272,7 +283,7 @@ public static function cache($bin = 'default') { * An expirable key value store collection. */ public static function keyValueExpirable($collection) { - return static::$container->get('keyvalue.expirable')->get($collection); + return static::getContainer()->get('keyvalue.expirable')->get($collection); } /** @@ -283,7 +294,7 @@ public static function keyValueExpirable($collection) { * @ingroup lock */ public static function lock() { - return static::$container->get('lock'); + return static::getContainer()->get('lock'); } /** @@ -302,7 +313,7 @@ public static function lock() { * An immutable configuration object. */ public static function config($name) { - return static::$container->get('config.factory')->get($name); + return static::getContainer()->get('config.factory')->get($name); } /** @@ -316,7 +327,7 @@ public static function config($name) { * The configuration factory service. */ public static function configFactory() { - return static::$container->get('config.factory'); + return static::getContainer()->get('config.factory'); } /** @@ -342,7 +353,7 @@ public static function configFactory() { * The queue object for a given name. */ public static function queue($name, $reliable = FALSE) { - return static::$container->get('queue')->get($name, $reliable); + return static::getContainer()->get('queue')->get($name, $reliable); } /** @@ -354,7 +365,7 @@ public static function queue($name, $reliable = FALSE) { * @return \Drupal\Core\KeyValueStore\KeyValueStoreInterface */ public static function keyValue($collection) { - return static::$container->get('keyvalue')->get($collection); + return static::getContainer()->get('keyvalue')->get($collection); } /** @@ -369,7 +380,7 @@ public static function keyValue($collection) { * @return \Drupal\Core\State\StateInterface */ public static function state() { - return static::$container->get('state'); + return static::getContainer()->get('state'); } /** @@ -379,7 +390,7 @@ public static function state() { * A guzzle http client instance. */ public static function httpClient() { - return static::$container->get('http_client'); + return static::getContainer()->get('http_client'); } /** @@ -396,7 +407,7 @@ public static function httpClient() { * The query object that can query the given entity type. */ public static function entityQuery($entity_type, $conjunction = 'AND') { - return static::$container->get('entity.query')->get($entity_type, $conjunction); + return static::getContainer()->get('entity.query')->get($entity_type, $conjunction); } /** @@ -413,7 +424,7 @@ public static function entityQuery($entity_type, $conjunction = 'AND') { * The query object that can query the given entity type. */ public static function entityQueryAggregate($entity_type, $conjunction = 'AND') { - return static::$container->get('entity.query')->getAggregate($entity_type, $conjunction); + return static::getContainer()->get('entity.query')->getAggregate($entity_type, $conjunction); } /** @@ -422,7 +433,7 @@ public static function entityQueryAggregate($entity_type, $conjunction = 'AND') * @return \Drupal\Core\Flood\FloodInterface */ public static function flood() { - return static::$container->get('flood'); + return static::getContainer()->get('flood'); } /** @@ -431,7 +442,7 @@ public static function flood() { * @return \Drupal\Core\Extension\ModuleHandlerInterface */ public static function moduleHandler() { - return static::$container->get('module_handler'); + return static::getContainer()->get('module_handler'); } /** @@ -445,7 +456,7 @@ public static function moduleHandler() { * @see \Drupal\Core\TypedData\TypedDataManager::create() */ public static function typedDataManager() { - return static::$container->get('typed_data_manager'); + return static::getContainer()->get('typed_data_manager'); } /** @@ -455,7 +466,7 @@ public static function typedDataManager() { * The token service. */ public static function token() { - return static::$container->get('token'); + return static::getContainer()->get('token'); } /** @@ -465,7 +476,7 @@ public static function token() { * The url generator service. */ public static function urlGenerator() { - return static::$container->get('url_generator'); + return static::getContainer()->get('url_generator'); } /** @@ -494,7 +505,7 @@ public static function urlGenerator() { * @see \Drupal\Core\Url::fromUri() */ public static function url($route_name, $route_parameters = array(), $options = array()) { - return static::$container->get('url_generator')->generateFromRoute($route_name, $route_parameters, $options); + return static::getContainer()->get('url_generator')->generateFromRoute($route_name, $route_parameters, $options); } /** @@ -503,7 +514,7 @@ public static function url($route_name, $route_parameters = array(), $options = * @return \Drupal\Core\Utility\LinkGeneratorInterface */ public static function linkGenerator() { - return static::$container->get('link_generator'); + return static::getContainer()->get('link_generator'); } /** @@ -525,7 +536,7 @@ public static function linkGenerator() { * @see \Drupal\Core\Url */ public static function l($text, Url $url) { - return static::$container->get('link_generator')->generate($text, $url); + return static::getContainer()->get('link_generator')->generate($text, $url); } /** @@ -535,7 +546,7 @@ public static function l($text, Url $url) { * The string translation manager. */ public static function translation() { - return static::$container->get('string_translation'); + return static::getContainer()->get('string_translation'); } /** @@ -545,7 +556,7 @@ public static function translation() { * The language manager. */ public static function languageManager() { - return static::$container->get('language_manager'); + return static::getContainer()->get('language_manager'); } /** @@ -562,7 +573,7 @@ public static function languageManager() { * @see \Drupal\Core\Session\SessionManager::start() */ public static function csrfToken() { - return static::$container->get('csrf_token'); + return static::getContainer()->get('csrf_token'); } /** @@ -572,7 +583,7 @@ public static function csrfToken() { * The transliteration manager. */ public static function transliteration() { - return static::$container->get('transliteration'); + return static::getContainer()->get('transliteration'); } /** @@ -582,7 +593,7 @@ public static function transliteration() { * The form builder. */ public static function formBuilder() { - return static::$container->get('form_builder'); + return static::getContainer()->get('form_builder'); } /** @@ -591,7 +602,7 @@ public static function formBuilder() { * @return \Drupal\Core\Theme\ThemeManagerInterface */ public static function theme() { - return static::$container->get('theme.manager'); + return static::getContainer()->get('theme.manager'); } /** @@ -601,7 +612,7 @@ public static function theme() { * Returns TRUE is syncing flag set. */ public static function isConfigSyncing() { - return static::$container->get('config.installer')->isSyncing(); + return static::getContainer()->get('config.installer')->isSyncing(); } /** @@ -615,7 +626,7 @@ public static function isConfigSyncing() { * The logger for this channel. */ public static function logger($channel) { - return static::$container->get('logger.factory')->get($channel); + return static::getContainer()->get('logger.factory')->get($channel); } /** @@ -625,7 +636,7 @@ public static function logger($channel) { * The menu tree. */ public static function menuTree() { - return static::$container->get('menu.link_tree'); + return static::getContainer()->get('menu.link_tree'); } /** @@ -634,7 +645,7 @@ public static function menuTree() { * @return \Drupal\Core\Path\PathValidatorInterface */ public static function pathValidator() { - return static::$container->get('path.validator'); + return static::getContainer()->get('path.validator'); } /** @@ -644,7 +655,7 @@ public static function pathValidator() { * The access manager service. */ public static function accessManager() { - return static::$container->get('access_manager'); + return static::getContainer()->get('access_manager'); } } diff --git a/core/lib/Drupal/Core/DependencyInjection/ContainerNotInitializedException.php b/core/lib/Drupal/Core/DependencyInjection/ContainerNotInitializedException.php new file mode 100644 index 0000000..1ef7ebd --- /dev/null +++ b/core/lib/Drupal/Core/DependencyInjection/ContainerNotInitializedException.php @@ -0,0 +1,18 @@ +container = NULL; - \Drupal::setContainer(NULL); + \Drupal::unsetContainer(); // Unset globals. unset($GLOBALS['config_directories']); diff --git a/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php b/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php index a7bcca7..43dee4f 100644 --- a/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php +++ b/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php @@ -19,7 +19,7 @@ class GetFilenameUnitTest extends KernelTestBase { protected function setUp() { parent::setUp(); $this->container = NULL; - \Drupal::setContainer(NULL); + \Drupal::unsetContainer(); } /** diff --git a/core/tests/Drupal/Tests/Core/DrupalContainerNotInitializedTest.php b/core/tests/Drupal/Tests/Core/DrupalContainerNotInitializedTest.php new file mode 100644 index 0000000..9a562d2 --- /dev/null +++ b/core/tests/Drupal/Tests/Core/DrupalContainerNotInitializedTest.php @@ -0,0 +1,105 @@ +root = dirname(dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__)))); }