diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php index c3f2c90..c724a06 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,23 +104,30 @@ 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 - * should not be used otherwise. + * @throws \Drupal\Core\DependencyInjection\ContainerNotInitializedException * * @return \Symfony\Component\DependencyInjection\ContainerInterface|null */ public static function getContainer() { + if (static::$container === NULL) { + throw new ContainerNotInitializedException('\Drupal::$container is not initialized yet. \Drupal::setContainer() must be called with a real container.'); + } return static::$container; } @@ -146,7 +154,7 @@ public static function hasContainer() { * The specified service. */ public static function service($id) { - return static::$container->get($id); + return static::getContainer()->get($id); } /** @@ -169,7 +177,7 @@ public static function hasService($id) { * @return string */ public static function root() { - return static::$container->get('app.root'); + return static::getContainer()->get('app.root'); } /** @@ -206,7 +214,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(); } /** @@ -216,7 +224,7 @@ public static function request() { * The request stack */ public static function requestStack() { - return static::$container->get('request_stack'); + return static::getContainer()->get('request_stack'); } /** @@ -226,7 +234,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'); } /** @@ -235,7 +243,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'); } /** @@ -245,7 +253,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'); } /** @@ -255,7 +263,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'); } /** @@ -271,7 +279,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); } /** @@ -284,7 +292,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); } /** @@ -295,7 +303,7 @@ public static function keyValueExpirable($collection) { * @ingroup lock */ public static function lock() { - return static::$container->get('lock'); + return static::getContainer()->get('lock'); } /** @@ -314,7 +322,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); } /** @@ -328,7 +336,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'); } /** @@ -354,7 +362,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); } /** @@ -366,7 +374,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); } /** @@ -381,7 +389,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'); } /** @@ -391,7 +399,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'); } /** @@ -408,7 +416,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); } /** @@ -425,7 +433,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); } /** @@ -434,7 +442,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'); } /** @@ -443,7 +451,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'); } /** @@ -457,7 +465,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'); } /** @@ -467,7 +475,7 @@ public static function typedDataManager() { * The token service. */ public static function token() { - return static::$container->get('token'); + return static::getContainer()->get('token'); } /** @@ -477,7 +485,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'); } /** @@ -506,7 +514,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); } /** @@ -515,7 +523,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'); } /** @@ -537,7 +545,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); } /** @@ -547,7 +555,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'); } /** @@ -557,7 +565,7 @@ public static function translation() { * The language manager. */ public static function languageManager() { - return static::$container->get('language_manager'); + return static::getContainer()->get('language_manager'); } /** @@ -574,7 +582,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'); } /** @@ -584,7 +592,7 @@ public static function csrfToken() { * The transliteration manager. */ public static function transliteration() { - return static::$container->get('transliteration'); + return static::getContainer()->get('transliteration'); } /** @@ -594,7 +602,7 @@ public static function transliteration() { * The form builder. */ public static function formBuilder() { - return static::$container->get('form_builder'); + return static::getContainer()->get('form_builder'); } /** @@ -603,7 +611,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'); } /** @@ -613,7 +621,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(); } /** @@ -627,7 +635,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); } /** @@ -637,7 +645,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'); } /** @@ -646,7 +654,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'); } /** @@ -656,7 +664,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/simpletest/src/Tests/KernelTestBaseTest.php b/core/modules/simpletest/src/Tests/KernelTestBaseTest.php index 270e08c..4d09490 100644 --- a/core/modules/simpletest/src/Tests/KernelTestBaseTest.php +++ b/core/modules/simpletest/src/Tests/KernelTestBaseTest.php @@ -27,7 +27,7 @@ class KernelTestBaseTest extends KernelTestBase { * {@inheritdoc} */ protected function setUp() { - $original_container = \Drupal::getContainer(); + $original_container = $this->originalContainer; parent::setUp(); $this->assertNotIdentical(\Drupal::getContainer(), $original_container, 'KernelTestBase test creates a new container.'); } diff --git a/core/modules/simpletest/src/Tests/SimpleTestTest.php b/core/modules/simpletest/src/Tests/SimpleTestTest.php index 92a4529..eb900ab 100644 --- a/core/modules/simpletest/src/Tests/SimpleTestTest.php +++ b/core/modules/simpletest/src/Tests/SimpleTestTest.php @@ -97,7 +97,7 @@ class: Drupal\Core\Cache\MemoryBackendFactory EOD; file_put_contents($this->siteDirectory . '/testing.services.yml', $yaml); - $original_container = \Drupal::getContainer(); + $original_container = $this->originalContainer; parent::setUp(); $this->assertNotIdentical(\Drupal::getContainer(), $original_container, 'WebTestBase test creates a new container.'); // Create and log in an admin user. diff --git a/core/modules/simpletest/src/WebTestBase.php b/core/modules/simpletest/src/WebTestBase.php index c9a4b0d..324aeb8 100644 --- a/core/modules/simpletest/src/WebTestBase.php +++ b/core/modules/simpletest/src/WebTestBase.php @@ -1030,7 +1030,7 @@ protected function installParameters() { protected function getDatabaseTypes() { \Drupal::setContainer($this->originalContainer); $database_types = drupal_get_database_types(); - \Drupal::setContainer(NULL); + \Drupal::unsetContainer(); return $database_types; } diff --git a/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php b/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php index 9baf5cd..f867045 100644 --- a/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php +++ b/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php @@ -31,7 +31,7 @@ protected function setUp() { // Store the previous container. $this->previousContainer = $this->container; $this->container = NULL; - \Drupal::setContainer(NULL); + \Drupal::unsetContainer(); } /** @@ -55,7 +55,7 @@ function testDrupalGetFilename() { // Assert that this test is meaningful. $this->assertNull($this->container); - $this->assertNull(\Drupal::getContainer()); + $this->assertFalse(\Drupal::hasContainer()); // Retrieving the location of a module. $this->assertIdentical(drupal_get_filename('module', 'system'), 'core/modules/system/system.info.yml'); diff --git a/core/modules/system/src/Tests/DrupalKernel/DrupalKernelTest.php b/core/modules/system/src/Tests/DrupalKernel/DrupalKernelTest.php index 8920478..ebd8307 100644 --- a/core/modules/system/src/Tests/DrupalKernel/DrupalKernelTest.php +++ b/core/modules/system/src/Tests/DrupalKernel/DrupalKernelTest.php @@ -41,7 +41,7 @@ protected function setUp() { protected function prepareConfigDirectories() { \Drupal::setContainer($this->originalContainer); parent::prepareConfigDirectories(); - \Drupal::setContainer(NULL); + \Drupal::unsetContainer(); } /** diff --git a/core/tests/Drupal/Tests/Core/DrupalTest.php b/core/tests/Drupal/Tests/Core/DrupalTest.php index 2f300a3..315ce38 100644 --- a/core/tests/Drupal/Tests/Core/DrupalTest.php +++ b/core/tests/Drupal/Tests/Core/DrupalTest.php @@ -26,7 +26,11 @@ class DrupalTest extends UnitTestCase { */ protected $container; + /** + * {@inheritdoc} + */ protected function setUp() { + parent::setUp(); $this->container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder') ->setMethods(array('get')) ->getMock(); @@ -43,6 +47,16 @@ public function testSetContainer() { } /** + * @covers ::getContainer + * + * @expectedException \Drupal\Core\DependencyInjection\ContainerNotInitializedException + * @expectedExceptionMessage \Drupal::$container is not initialized yet. \Drupal::setContainer() must be called with a real container. + */ + public function testGetContainerException() { + \Drupal::getContainer(); + } + + /** * Tests the service() method. * * @covers ::service diff --git a/core/tests/Drupal/Tests/UnitTestCase.php b/core/tests/Drupal/Tests/UnitTestCase.php index d6deb9e..e82c3a9 100644 --- a/core/tests/Drupal/Tests/UnitTestCase.php +++ b/core/tests/Drupal/Tests/UnitTestCase.php @@ -39,7 +39,7 @@ protected function setUp() { parent::setUp(); // Ensure that an instantiated container in the global state of \Drupal from // a previous test does not leak into this test. - \Drupal::setContainer(NULL); + \Drupal::unsetContainer(); $this->root = dirname(dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__)))); }