在 Drupal 8 中定义和使用你自己的配置
主要主题:定义自定义配置
你可以在自己的模块中 包含默认配置,其基础是其他模块的功能(节点类型、视图、字段、文本格式等)。
例如,节点模块提供节点类型的配置,因此你可以在自己的模块中定义一个默认的节点类型,并随模块一起提供。
你可能希望为自己的插件、实体和设置定义配置,而这些配置又可以被其他模块使用,就像你可以使用节点类型的配置一样。Drupal 8 让定义你自己的配置变得更简单。
配置文件
模块的配置文件放在模块的 config/install 子目录中。例如,如果模块在 /modules/example 下,那么配置文件路径就是 /modules/example/config/install/example.settings.yml。你可以在此目录中放置模块的配置文件,格式为 YAML。
虽然不是强制要求,但强烈推荐你在为模块定义配置文件时使用模块名称作为前缀:例如 example.settings.yml 用于配置参数。不要将文件命名为 settings.yml 或 system.settings.yml,因为这可能与其他地方的文件名冲突。如果你不遵循此约定,Drush 命令(如 drush config:import)可能会出现问题。
这也允许你为其他组件提供配置,例如一个节点类型示例,你可以 在模块中包含默认配置,其中配置文件为 node.type.example_mytype.yml,节点模块会将其识别为一个节点类型。
配置文件的文件名(不包括 .yml 扩展名)也就是系统中的配置名称,你可以通过 PHP API 来访问它。
配置文件结构
配置文件必须使用 YAML 格式。你可以根据自己的需要组织配置文件,没有其他限制,除了 YAML 本身的语法。例如,如果你需要一个参数来在页面控制器中输出某些内容,文件可以包含一个带字符串值的 message 键:
message: 'Hello' langcode: 'en'
建议在文件中包含 langcode 键来声明语言代码。语言系统会用它来提供翻译的支持。langcode 键是保留字段,不能在文件顶层用于其他目的。
要实现配置的翻译,需要启用 配置翻译模块。
为了让配置支持翻译,你需要再添加两个文件:
- /modules/example/config/schema/example.schema.yml
- /modules/example/example.config_translation.yml
第一个文件定义了自定义配置的 配置架构。我们定义 example.settings 为一个 config_object,包含几个字段。每个字段都有一个类型:基础类型定义决定字段是否可翻译(见 core.data_types.schema.yml)。例如,path 保存的是 Drupal 内部路径,因此不可翻译,而 text 是可翻译的。
# /modules/example/config/schema/example.schema.yml example.settings: type: config_object label: 'Example config' mapping: message: type: text label: 'Message'
第二个文件为 /admin/config/regional/config-translation 添加了一个翻译表单的入口:
# /modules/example/example.config_translation.yml example.admin.config: title: 'Example module' base_route_name: example.admin.config names: - example.settings
按照约定,键名与基础路由名称相同:example.admin.config 是模块配置表单的路由名。names 列表包含所有在该表单中可编辑的配置键,本例中就是上面架构中定义的自定义配置。
文件也可以包含更复杂的列表和键/值树形结构。例如可以参考 views.view.content.yml 文件,它展示了一个更复杂的配置文件。
配置翻译功能会自动为模块配置表单添加一个“翻译”标签页,不过如果这是唯一的标签页,它可能不会显示。为了添加一个“默认”标签页到配置表单,你需要再添加一个文件 example.links.task.yml(参见 模块定义的本地任务)。
// example.links.task.yml example.admin.config: route_name: example.admin.config title: Settings base_route: example.admin.config
使用配置
Drupal 8 提供了 PHP API 来读取和写入配置。最简单的使用方法是静态方法 Drupal::config():
$config = \Drupal::config('example.settings'); // 将输出 'Hello'。 print $config->get('message'); // 将输出 'en'。 print $config->get('langcode');
如果你想编辑配置并用新值更新它,可以使用 \Drupal::service('config.factory')->getEditable() 方法:
$config = \Drupal::service('config.factory')->getEditable('example.settings'); // 设置并保存新的 message 值。 $config->set('message', 'Hi')->save(); // 现在将输出 'Hi'。 print $config->get('message');