9.3 覆写系统配置

1、覆写Global

Drupal8可以使用$config这个全局变量来访问配置。

通常通过Drupal\Core\Config\ConfigFactory::get()这个API来获取配置的值。

比如,我们获取网站维护的message:

$message = \Drupal::config('system.maintenance')->get('message');

可以在setting.php中直接来覆写这个变量:

$config['system.maintenance']['message'] = 'Sorry, our site is down now.';

在性能-> css合并这里,安装完以后Drupal8是默认打开的,关闭代码如下:

$config['system.performance']['css']['preprocess'] = 0;

然后通过drush命令查看是否覆写成功。

drush config-list
drush config-get system.performance

2、获取原值

配置被覆写了以后,怎么获取原值呢?以下是示例代码:

// Get the site name, with overrides.
$site_name = \Drupal::config('system.site')->get('name');

// Get the site name without overrides.
$site_name = \Drupal::config('system.site')->getOriginal('name', FALSE);

// Note that mutable config is always override free.
$site_name = \Drupal::configFactory()->getEditable('system.site')->get('name');

3、覆写语言配置

多语言站点中,要给用户发送邮件,这时候邮件语言取决于用户的语言配置。代码如下:

// Load the language_manager service
$language_manager = \Drupal::service('language_manager');

// Get the target language object
$langcode = $account->getPreferredLangcode();
$language = $language_manager->getLanguage($langcode);

// Remember original language before this operation.
$original_language = $language_manager->getConfigOverrideLanguage();
// Set the translation target language on the configuration factory.
$language_manager->setConfigOverrideLanguage($language);

$mail_config  = \Drupal::config('user.mail');

// Now send email based on $mail_config which is in the proper language.

// Set the configuration language back.
$language_manager->setConfigOverrideLanguage($original_language);

这段代码主要是把user.mail这个配置更改为language.config.$langcode.user.mail,主要发送邮件的时候就会自动找用户设置的语言,从而找到跟用户语言相符合的邮件模板。

4、模块中覆写配置

ConfigFactory会扫描所有模块,并从中找到实现了config.factory.override的service。 如在hello_world.services.yml中定义如下:

services:
  hello_world.config_example.overrider:
    class: \Drupal\hello_world\ConfigExampleOverrides
    tags:
      - {name: config.factory.override, priority: 5}

在src/ConfigExampleOverrides.php编写如下代码:

namespace Drupal\hello_world;

use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\Config\ConfigFactoryOverrideInterface;
use Drupal\Core\Config\StorageInterface;

/**
 * Example configuration override.
 */
class ConfigExampleOverrides implements ConfigFactoryOverrideInterface {

  public function loadOverrides($names) {
    $overrides = array();
    if (in_array('system.site', $names)) {
      $overrides['system.site'] = ['name' => 'Overridden site name!'];
    }
    return $overrides;
  }

  /**
   * {@inheritdoc}
   */
  public function getCacheSuffix() {
    return 'ConfigExampleOverrider';
  }

  /**
   * {@inheritdoc}
   */
  public function getCacheableMetadata($name) {
    return new CacheableMetadata();
  }

  /**
   * {@inheritdoc}
   */
  public function createConfigObject($name, $collection = StorageInterface::DEFAULT_COLLECTION) {
    return NULL;
  }

}

上面代码实现了ConfigFactoryOverrideInterface的四个方法:

  • loadOverrides: 返回配置覆写数组
  • getCacheSuffix: 返回cache的前缀名称
  • getCacheableMetadata: 返回被覆写后的cache数据
  • createConfigObject: 安装或同步的时候创建一个config对象,这里是覆写,所有返回NULL

本书共79小节:

评论 (写第一个评论)