diff --git a/core/core.services.yml b/core/core.services.yml index 79f1fc1..57aa0c5 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -68,25 +68,11 @@ services: arguments: ['@config.cachedstorage.storage', '@cache.config'] tags: - { name: persist } - config.context.factory: - class: Drupal\Core\Config\Context\ConfigContextFactory - arguments: ['@event_dispatcher', '@uuid'] - config.context: - class: Drupal\Core\Config\Context\ContextInterface - tags: - - { name: persist } - factory_method: get - factory_service: config.context.factory - config.context.free: - class: Drupal\Core\Config\Context\ContextInterface - factory_method: get - factory_service: config.context.factory - arguments: [Drupal\Core\Config\Context\FreeConfigContext] config.factory: class: Drupal\Core\Config\ConfigFactory tags: - { name: persist } - arguments: ['@config.storage', '@config.context'] + arguments: ['@config.storage'] config.storage.staging: class: Drupal\Core\Config\FileStorage factory_class: Drupal\Core\Config\FileStorageFactory diff --git a/core/includes/config.inc b/core/includes/config.inc index fa804ac..322be2c 100644 --- a/core/includes/config.inc +++ b/core/includes/config.inc @@ -16,6 +16,22 @@ */ /** + * Sets the language on the configuration object factory. + * + * @param Drupal\Core\Language\Language $language + * The language that config objects should have injected in to them. + * + * @return Drupal\Core\Language\Language $language + * The language object that was previously set in the config factory. + */ +function config_factory_set_language(Language $language) { + $current_language = Drupal::service('config.factory')->getLanguage(); + drupal_container()->get('config.factory')->setLanguage($language); + Drupal::service('config.factory')->setLanguage($language); + return $current_language; +} + +/** * Installs the default configuration of a given extension. * * When an extension is installed, it searches all the default configuration @@ -131,54 +147,6 @@ function config($name) { } /** - * Sets the config context on the config factory. - * - * This allows configuration objects to be created using special configuration - * contexts eg. global override free or locale using a user preferred language. - * Calling this function affects all subsequent calls to \Drupal::config() until - * config_context_leave() is called. - * - * @see config_context_leave() - * @see \Drupal\Core\Config\ConfigFactory - * - * @param string $context_name - * The name of the config context service on the container or a fully - * qualified class implementing \Drupal\Core\Config\Context\ContextInterface. - * - * @return \Drupal\Core\Config\Context\ContextInterface - * The configuration context object. - */ -function config_context_enter($context_name) { - if (drupal_container()->has($context_name)) { - $context = drupal_container()->get($context_name); - } - elseif (class_exists($context_name) && in_array('Drupal\Core\Config\Context\ContextInterface', class_implements($context_name))) { - $context = drupal_container() - ->get('config.context.factory') - ->get($context_name); - } - else { - throw new ConfigException(sprintf('Unknown config context service or class: %s', $context_name)); - } - drupal_container() - ->get('config.factory') - ->enterContext($context); - return $context; -} - -/** - * Leaves the current config context returning to the previous context. - * - * @see config_context_enter() - * @see \Drupal\Core\Config\ConfigFactory - */ -function config_context_leave() { - drupal_container() - ->get('config.factory') - ->leaveContext(); -} - -/** * Return a list of all config entity types provided by a module. * * @param string $module diff --git a/core/includes/errors.inc b/core/includes/errors.inc index 1639ba5..8e3a83a 100644 --- a/core/includes/errors.inc +++ b/core/includes/errors.inc @@ -54,6 +54,8 @@ function drupal_error_levels() { */ function _drupal_error_handler_real($error_level, $message, $filename, $line, $context) { if ($error_level & error_reporting()) { + $args = func_get_args(); + ffs($args); $types = drupal_error_levels(); list($severity_msg, $severity_level) = $types[$error_level]; $backtrace = debug_backtrace(); diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc index 91a241f..1a97a96 100644 --- a/core/includes/install.core.inc +++ b/core/includes/install.core.inc @@ -374,17 +374,9 @@ function install_begin_request(&$install_state) { $container->register('event_dispatcher', 'Symfony\Component\EventDispatcher\EventDispatcher'); $container->register('config.storage', 'Drupal\Core\Config\InstallStorage'); - $container->register('config.context.factory', 'Drupal\Core\Config\Context\ConfigContextFactory') - ->addArgument(new Reference('event_dispatcher')) - ->addArgument(new Reference('uuid')); - - $container->register('config.context', 'Drupal\Core\Config\Context\ContextInterface') - ->setFactoryService(new Reference('config.context.factory')) - ->setFactoryMethod('get'); $container->register('config.factory', 'Drupal\Core\Config\ConfigFactory') - ->addArgument(new Reference('config.storage')) - ->addArgument(new Reference('config.context')); + ->addArgument(new Reference('config.storage')); // Register the 'language_manager' service. $container diff --git a/core/lib/Drupal/Core/Config/Config.php b/core/lib/Drupal/Core/Config/Config.php index 02afbd1..039fd0d 100644 --- a/core/lib/Drupal/Core/Config/Config.php +++ b/core/lib/Drupal/Core/Config/Config.php @@ -9,7 +9,7 @@ use Drupal\Component\Utility\NestedArray; use Drupal\Core\Config\ConfigNameException; -use Drupal\Core\Config\Context\ContextInterface; +use Drupal\Core\Language\Language; /** * Defines the default configuration object. @@ -29,6 +29,13 @@ class Config { const MAX_NAME_LENGTH = 250; /** + * The Language object used to override configuration data. + * + * @var Drupal\Core\Language\Language + */ + protected $language; + + /** * The name of the configuration object. * * @var string @@ -64,13 +71,6 @@ class Config { protected $storage; /** - * The configuration context used for this configuration object. - * - * @var \Drupal\Core\Config\Context\ContextInterface - */ - protected $context; - - /** * Whether the config object has already been loaded. * * @var bool @@ -85,13 +85,13 @@ class Config { * @param \Drupal\Core\Config\StorageInterface $storage * A storage controller object to use for reading and writing the * configuration data. - * @param \Drupal\Core\Config\Context\ContextInterface $context - * The configuration context used for this configuration object. + * @param Drupal\Core\Language\Language $language + * The Language object used to override configuration data. */ - public function __construct($name, StorageInterface $storage, ContextInterface $context) { + public function __construct($name, StorageInterface $storage, Language $language) { $this->name = $name; $this->storage = $storage; - $this->context = $context; + $this->language = $language; } /** @@ -287,7 +287,6 @@ protected function replaceData(array $data) { * The configuration object. */ public function setOverride(array $data) { - $this->context->setOverrides($this->getName(), $data); $this->resetOverriddenData(); return $this; } @@ -302,8 +301,7 @@ public function setOverride(array $data) { */ protected function setOverriddenData() { $this->overriddenData = $this->data; - $overrides = $this->context->getOverrides($this->getName()); - if (is_array($overrides)) { + if (isset($overrides) && is_array($overrides)) { $this->overriddenData = NestedArray::mergeDeepArray(array($this->overriddenData, $overrides), TRUE); } return $this; @@ -488,7 +486,6 @@ public function getStorage() { * Dispatch a config event. */ protected function notify($config_event_name) { - $this->context->notify($config_event_name, $this); } /** @@ -508,4 +505,27 @@ public function merge(array $data_to_merge) { $this->replaceData(NestedArray::mergeDeepArray(array($this->data, $data_to_merge), TRUE)); return $this; } + + /** + * Returns the language object for this Config object. + * + * @return \Drupal\Core\Language\Language + */ + public function getLanguage() { + return $this->language; + } + + /** + * Get configuration name for this language. + * + * It will be the same name with a prefix depending on language code: + * locale.config.LANGCODE.NAME + * + * @return string + * The localized config name. + */ + public function getLocaleConfigName() { + return 'locale.config.' . $this->language->id . '.' . $this->getName(); + } } + diff --git a/core/lib/Drupal/Core/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php index fe9f4cb..4994f4b 100644 --- a/core/lib/Drupal/Core/Config/ConfigFactory.php +++ b/core/lib/Drupal/Core/Config/ConfigFactory.php @@ -8,6 +8,7 @@ namespace Drupal\Core\Config; use Drupal\Core\Config\Context\ContextInterface; +use Drupal\Core\Language\Language; /** * Defines the configuration object factory. @@ -22,11 +23,10 @@ * * @see Drupal\Core\Config\StorageInterface * - * A configuration context is an object containing parameters that will be - * available to the configuration plug-ins for them to customize the - * configuration data in different ways. * - * @see Drupal\Core\Config\Context\ContextInterface + * @todo: + * -- when to fire the config override event? + * --- once during __construct(), then again on any call to setLanguage()? */ class ConfigFactory { @@ -38,11 +38,11 @@ class ConfigFactory { protected $storage; /** - * A stack of configuration contexts the last being the context in use. + * The Language object used to override configuration data. * - * @var array + * @var Drupal\Core\Language\Language */ - protected $contextStack = array(); + protected $language; /** * Cached configuration objects. @@ -59,9 +59,11 @@ class ConfigFactory { * @param \Drupal\Core\Config\Context\ContextInterface * Configuration context object. */ - public function __construct(StorageInterface $storage, ContextInterface $context) { + public function __construct(StorageInterface $storage, Language $language = NULL) { $this->storage = $storage; - $this->enterContext($context); + // @todo: always inject language, once we figure out how to handle language + // and the DIC in early bootstrap phases. + $this->language = isset($language) ? $language : language_default(); } /** @@ -74,18 +76,17 @@ public function __construct(StorageInterface $storage, ContextInterface $context * A configuration object. */ public function get($name) { - $context = $this->getContext(); - $cache_key = $this->getCacheKey($name, $context); + $cache_key = $this->getCacheKey($name); if (isset($this->cache[$cache_key])) { return $this->cache[$cache_key]; } - $this->cache[$cache_key] = new Config($name, $this->storage, $context); + $this->cache[$cache_key] = new Config($name, $this->storage, $this->language); return $this->cache[$cache_key]->init(); } /** - * Returns a list of configuration objects for a given names and context. + * Returns a list of configuration objects for a given names. * * This will pre-load all requested configuration objects does not create * new configuration objects. @@ -97,11 +98,9 @@ public function get($name) { * List of successfully loaded configuration objects, keyed by name. */ public function loadMultiple(array $names) { - $context = $this->getContext(); - $list = array(); foreach ($names as $key => $name) { - $cache_key = $this->getCacheKey($name, $context); + $cache_key = $this->getCacheKey($name); // @todo: Deleted configuration stays in $this->cache, only return // config entities that are not new. if (isset($this->cache[$cache_key]) && !$this->cache[$cache_key]->isNew()) { @@ -114,8 +113,8 @@ public function loadMultiple(array $names) { if (!empty($names)) { $storage_data = $this->storage->readMultiple($names); foreach ($storage_data as $name => $data) { - $cache_key = $this->getCacheKey($name, $context); - $this->cache[$cache_key] = new Config($name, $this->storage, $context); + $cache_key = $this->getCacheKey($name); + $this->cache[$cache_key] = new Config($name, $this->storage, $this->language); $this->cache[$cache_key]->initWithData($data); $list[$name] = $this->cache[$cache_key]; } @@ -163,16 +162,15 @@ public function reset($name = NULL) { * The renamed config object. */ public function rename($old_name, $new_name) { - $context = $this->getContext(); - $old_cache_key = $this->getCacheKey($old_name, $context); - $new_cache_key = $this->getCacheKey($new_name, $context); + $old_cache_key = $this->getCacheKey($old_name); + $new_cache_key = $this->getCacheKey($new_name); if (isset($this->cache[$old_cache_key])) { $config = $this->cache[$old_cache_key]; unset($this->cache[$old_cache_key]); } else { // Create the config object if it's not yet loaded into the static cache. - $config = new Config($old_name, $this->storage, $context); + $config = new Config($old_name, $this->storage, $this->language); } $this->cache[$new_cache_key] = $config; @@ -181,59 +179,16 @@ public function rename($old_name, $new_name) { } /** - * Sets the config context by adding it to the context stack. - * - * @param \Drupal\Core\Config\Context\ContextInterface $context - * The configuration context to add. - * - * @return \Drupal\Core\Config\ConfigFactory - * The config factory object. - */ - public function enterContext(ContextInterface $context) { - // Initialize the context as it is being entered. - $this->contextStack[] = $context->init(); - return $this; - } - - /** - * Gets the current config context. - * - * @return \Drupal\Core\Config\Context\ContextInterface $context - * The current configuration context. - */ - public function getContext() { - return end($this->contextStack); - } - - /** - * Leaves the current context by removing it from the context stack. - * - * @return \Drupal\Core\Config\ConfigFactory - * The config factory object. - */ - public function leaveContext() { - // Ensure at least one context is left on the stack. We already ensured - // there is at least one context set by taking the initial one in the - // constructor. - if (count($this->contextStack) > 1) { - array_pop($this->contextStack); - } - return $this; - } - - /** - * Gets the cache key for a given config name in a particular context. + * Gets the cache key for a given config name. * * @param string $name * The name of the configuration object. - * @param \Drupal\Core\Config\Context\ContextInterface $context - * The configuration context. * * @return string * The cache key. */ - public function getCacheKey($name, ContextInterface $context) { - return $name . ':' . $context->getUuid(); + public function getCacheKey($name) { + return $this->language->id . ":$name"; } /** @@ -262,4 +217,41 @@ public function clearStaticCache() { $this->cache = array(); return $this; } + + /** + * Set the language to be injected in to Config objects. + * + * @param Language $language + * @return ConfigFactory + */ + public function setLanguage(Language $language) { + $this->language = $language; + return $this; + } + + /** + * Get the language to be injected in to Config objects. + * + * @return Drupal\Core\Language\Language + */ + public function getLanguage() { + return $this->language; + } + + /** + * Get configuration name for this language. + * + * It will be the same name with a prefix depending on language code: + * locale.config.LANGCODE.NAME + * + * @param string $name + * The name of the config object. + * + * @return string + * The localized config name. + */ + public function getLocaleConfigName($name) { + return 'locale.config.' . $this->language->id . '.' . $name; + } } + diff --git a/core/lib/Drupal/Core/Config/ConfigImporter.php b/core/lib/Drupal/Core/Config/ConfigImporter.php index ba2ece6..89e600b 100644 --- a/core/lib/Drupal/Core/Config/ConfigImporter.php +++ b/core/lib/Drupal/Core/Config/ConfigImporter.php @@ -7,7 +7,6 @@ namespace Drupal\Core\Config; -use Drupal\Core\Config\Context\FreeConfigContext; use Drupal\Core\Entity\EntityManager; use Drupal\Core\Lock\LockBackendInterface; use Drupal\Component\Uuid\UuidInterface; @@ -54,13 +53,6 @@ class ConfigImporter { protected $eventDispatcher; /** - * The configuration context. - * - * @var \Drupal\Core\Config\Context\ContextInterface - */ - protected $context; - - /** * The configuration factory. * * @var \Drupal\Core\Config\ConfigFactory @@ -127,10 +119,6 @@ public function __construct(StorageComparerInterface $storage_comparer, EventDis $this->lock = $lock; $this->uuidService = $uuid_service; $this->processed = $this->storageComparer->getEmptyChangelist(); - // Use an override free context for importing so that overrides to do not - // pollute the imported data. The context is hard coded to ensure this is - // the case. - $this->context = new FreeConfigContext($this->eventDispatcher, $this->uuidService); } /** @@ -224,7 +212,6 @@ public function import() { // Ensure that the changes have been validated. $this->validate(); - $this->configFactory->enterContext($this->context); if (!$this->lock->acquire(static::ID)) { // Another process is synchronizing configuration. throw new ConfigImporterException(sprintf('%s is already importing', static::ID)); @@ -237,9 +224,6 @@ public function import() { // The import is now complete. $this->lock->release(static::ID); $this->reset(); - // Leave the context used during import and clear the ConfigFactory's - // static cache. - $this->configFactory->leaveContext()->reset(); } return $this; } @@ -264,7 +248,7 @@ public function validate() { protected function importConfig() { foreach (array('delete', 'create', 'update') as $op) { foreach ($this->getUnprocessed($op) as $name) { - $config = new Config($name, $this->storageComparer->getTargetStorage(), $this->context); + $config = new Config($name, $this->storageComparer->getTargetStorage(), language_default()); if ($op == 'delete') { $config->delete(); } @@ -297,11 +281,11 @@ protected function importInvokeOwner() { // Validate the configuration object name before importing it. // Config::validateName($name); if ($entity_type = config_get_entity_type_by_name($name)) { - $old_config = new Config($name, $this->storageComparer->getTargetStorage(), $this->context); + $old_config = new Config($name, $this->storageComparer->getTargetStorage(), language_default()); $old_config->load(); $data = $this->storageComparer->getSourceStorage()->read($name); - $new_config = new Config($name, $this->storageComparer->getTargetStorage(), $this->context); + $new_config = new Config($name, $this->storageComparer->getTargetStorage(), language_default()); if ($data !== FALSE) { $new_config->setData($data); } diff --git a/core/lib/Drupal/Core/Config/Context/ConfigContext.php b/core/lib/Drupal/Core/Config/Context/ConfigContext.php deleted file mode 100644 index 128165b..0000000 --- a/core/lib/Drupal/Core/Config/Context/ConfigContext.php +++ /dev/null @@ -1,141 +0,0 @@ -eventDispatcher = $event_dispatcher; - $this->uuidService = $uuid; - } - - /** - * Implements \Drupal\Core\Config\Context\ContextInterface::init(). - */ - public function init() { - // Reset existing overrides and get a UUID for this context. - $this->overrides = array(); - $this->setUuid(); - // Notify event listeners that a configuration context has been created. - $this->notify('context', NULL); - return $this; - } - - /** - * Implements \Drupal\Core\Config\Context\ContextInterface::get(). - */ - public function get($key) { - return array_key_exists($key, $this->data) ? $this->data[$key] : NULL; - } - - /** - * Implements \Drupal\Core\Config\Context\ContextInterface::set(). - */ - public function set($key, $value) { - $this->data[$key] = $value; - } - - /** - * Implements \Drupal\Core\Config\Context\ContextInterface::setUuid(). - */ - public function setUuid() { - $this->uuid = $this->uuidService->generate(); - } - - /** - * Implements \Drupal\Core\Config\Context\ContextInterface::getUuid(). - */ - public function getUuid() { - return $this->uuid; - } - - /** - * Implements \Drupal\Core\Config\Context\ContextInterface::notify(). - */ - public function notify($config_event_name, Config $config = NULL) { - $this->eventDispatcher->dispatch('config.' . $config_event_name, new ConfigEvent($this, $config)); - } - - /** - * Implements \Drupal\Core\Config\Context\ContextInterface::setOverride(). - */ - public function setOverrides($config_name, $data) { - if (!isset($this->overrides[$config_name])) { - $this->overrides[$config_name] = $data; - } - else { - $this->overrides[$config_name] = NestedArray::mergeDeepArray(array($this->overrides[$config_name], $data), TRUE); - } - } - - /** - * Implements \Drupal\Core\Config\Context\ContextInterface::getOverrides(). - */ - public function getOverrides($config_name) { - if (isset($this->overrides[$config_name])) { - return $this->overrides[$config_name]; - } - return FALSE; - } - -} diff --git a/core/lib/Drupal/Core/Config/Context/ConfigContextFactory.php b/core/lib/Drupal/Core/Config/Context/ConfigContextFactory.php deleted file mode 100644 index de3fd7b..0000000 --- a/core/lib/Drupal/Core/Config/Context/ConfigContextFactory.php +++ /dev/null @@ -1,74 +0,0 @@ -eventDispatcher = $event_dispatcher; - $this->uuidService = $uuid; - } - - /** - * Returns a configuration context object. - * - * @param string $class - * (Optional) The name of the configuration class to use. Defaults to - * Drupal\Core\Config\Context\ConfigContext - * - * @return \Drupal\Core\Config\Context\ContextInterface $context - * (Optional) The configuration context to use. - */ - public function get($class = NULL) { - if (!$class) { - $class = 'Drupal\Core\Config\Context\ConfigContext'; - } - if (class_exists($class)) { - $context = new $class($this->eventDispatcher, $this->uuidService); - } - else { - throw new ConfigException(sprintf('Unknown config context class: %s', $class)); - } - return $context; - } - -} diff --git a/core/lib/Drupal/Core/Config/Context/ContextInterface.php b/core/lib/Drupal/Core/Config/Context/ContextInterface.php deleted file mode 100644 index e7e4904..0000000 --- a/core/lib/Drupal/Core/Config/Context/ContextInterface.php +++ /dev/null @@ -1,101 +0,0 @@ -set(self::LANGUAGE_KEY, $language); - // Re-initialize since the language change changes the context fundamentally. - $this->init(); - return $this; - } - -} diff --git a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php index 11fa899..dda8b89 100644 --- a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php +++ b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php @@ -7,7 +7,6 @@ namespace Drupal\locale; use Drupal\Core\Config\Config; -use Drupal\Core\Config\Context\ConfigContext; use Drupal\Core\Config\Context\ContextInterface; use Drupal\Core\Config\ConfigEvent; use Drupal\Core\Config\StorageDispatcher; @@ -18,7 +17,6 @@ use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; - /** * Locale Config helper * @@ -34,66 +32,13 @@ class LocaleConfigSubscriber implements EventSubscriberInterface { protected $languageManager; /** - * Default configuration context. - * - * @var \Drupal\Core\Config\Context\ContextInterface - */ - protected $defaultConfigContext; - - /** * Constructs a LocaleConfigSubscriber object. * * @param \Drupal\Core\Language\LanguageManager $language_manager * The language manager service. - * @param \Drupal\Core\Config\Context\ConfigContext $config_context - * The configuration context service. */ - public function __construct(LanguageManager $language_manager, ContextInterface $config_context) { + public function __construct(LanguageManager $language_manager) { $this->languageManager = $language_manager; - $this->defaultConfigContext = $config_context; - } - - /** - * Initializes configuration context with language. - * - * @param \Drupal\Core\Config\ConfigEvent $event - * The Event to process. - */ - public function configContext(ConfigEvent $event) { - $context = $event->getContext(); - - // If there is a language set explicitly in the current context, use it. - // Otherwise check if there is a user set in the current context, - // to set the language based on the preferred language of the user. - // Otherwise set it based on the negotiated interface language. - if ($language = $context->get('language')) { - $context->set('locale.language', $language); - } - elseif ($account = $context->get('user.account')) { - $context->set('locale.language', language_load($account->getPreferredLangcode())); - } - elseif ($language = $this->languageManager->getLanguage(Language::TYPE_INTERFACE)) { - $context->set('locale.language', $language); - } - } - - /** - * Override configuration values with localized data. - * - * @param \Drupal\Core\Config\ConfigEvent $event - * The Event to process. - */ - public function configLoad(ConfigEvent $event) { - $context = $event->getContext(); - if ($language = $context->get('locale.language')) { - $config = $event->getConfig(); - $locale_name = $this->getLocaleConfigName($config->getName(), $language); - // Check to see if the config storage has an appropriately named file - // containing override data. - if ($override = $event->getConfig()->getStorage()->read($locale_name)) { - $config->setOverride($override); - } - } } /** @@ -103,11 +48,7 @@ public function configLoad(ConfigEvent $event) { * Kernel event to respond to. */ public function onKernelRequestSetDefaultConfigContextLocale(GetResponseEvent $event) { - // Re-initialize the default configuration context to ensure any cached - // configuration object are reset and can be translated. This will invoke - // the config context event which will retrieve the negotiated language - // from the language manager in configContext(). - $this->defaultConfigContext->init(); + // Set the language on the ConfigFactory based on whatever we negotiate. } /** @@ -132,11 +73,10 @@ public function getLocaleConfigName($name, Language $language) { * Implements EventSubscriberInterface::getSubscribedEvents(). */ static function getSubscribedEvents() { - $events['config.context'][] = array('configContext', 20); - $events['config.load'][] = array('configLoad', 20); // Set the priority above the one from the RouteListener (priority 32) // so ensure that the context is cleared before the routing system steps in. $events[KernelEvents::REQUEST][] = array('onKernelRequestSetDefaultConfigContextLocale', 48); return $events; } } + diff --git a/core/modules/user/lib/Drupal/user/UserConfigContext.php b/core/modules/user/lib/Drupal/user/UserConfigContext.php deleted file mode 100644 index 1d5f497..0000000 --- a/core/modules/user/lib/Drupal/user/UserConfigContext.php +++ /dev/null @@ -1,45 +0,0 @@ -set(self::USER_KEY, $account); - // Re-initialize since the user change changes the context fundamentally. - $this->init(); - return $this; - } - -} diff --git a/core/modules/user/user.module b/core/modules/user/user.module index 24aee74..d9f94c4 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -1416,12 +1416,10 @@ function user_mail($key, &$message, $params) { $langcode = $message['langcode']; $variables = array('user' => $params['account']); - // Get configuration objects customized for the user specified in $params as - // this user is not necessarily the same as the one triggering the mail. This - // allows the configuration objects to be localized for the user's language if - // the locale module is enabled. - $user_config_context = config_context_enter('Drupal\user\UserConfigContext'); - $user_config_context->setAccount($params['account']); + $original_language = \Drupal::configFactory()->getLanguage(); + + $language = language_load($params['account']->getPreferredLangcode()); + \Drupal::configFactory()->setLanguage($language); $mail_config = \Drupal::config('user.mail'); // We do not sanitize the token replacement, since the output of this @@ -1430,8 +1428,7 @@ function user_mail($key, &$message, $params) { $message['subject'] .= $token_service->replace($mail_config->get($key . '.subject'), $variables, $token_options); $message['body'][] = $token_service->replace($mail_config->get($key . '.body'), $variables, $token_options); - // Return the previous config context. - config_context_leave(); + \Drupal::configFactory()->setLanguage($original_language); } /** diff --git a/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php b/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php index 75d051d..fba504a 100644 --- a/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php +++ b/core/tests/Drupal/Tests/Core/Routing/UrlGeneratorTest.php @@ -10,7 +10,6 @@ use Drupal\Component\Utility\Settings; use Drupal\Core\Config\ConfigFactory; use Drupal\Core\Config\NullStorage; -use Drupal\Core\Config\Context\ConfigContextFactory; use Drupal\Core\PathProcessor\PathProcessorAlias; use Drupal\Core\PathProcessor\PathProcessorManager; use Symfony\Component\EventDispatcher\EventDispatcher;