原文地址:
https://docs.acquia.com/article/lesson-32-configuration-and-config-object
Drupal 8 提供了一个 Config 对象 ,它可以和配置进行交互。
有些类已经通过依赖注入使它生效了,例如 ConfigFormBase 就是通过依赖注入提供了一个 Config 对象。
看下上一节的 configform_example 代码,它使用了父类的 config() 方法返回了 Config 对象,并用 configform_example.settings 填充了配置内容。之后使用 Config 对象的 get() 方法取得 email 地址作为 email 表单元素的默认值。
改变 Config 对象
在这个方法里我们首先返回 Config 对象,然后使用它的 set() 方法把 email_address 改为用户提交的值。接下来使用 save() 方法保存配置。最后我们应用父类的提交处理方法,因为它包含把 Drupal 信息显示到屏幕的功能。
public function submitForm(array &$form, FormStateInterface $form_state) { $config = $this->config('configform_example.settings'); $config->set('email_address', $form_state->getValue('email')); $config->save(); return parent::submitForm($form, $form_state); }
测试这个对象
把上节 ConfigFormExampleConfigForm.php 按以下代码修改,重建缓存测试。
<?php /** * @file * Contains \Drupal\configform_example\Form\ConfigFormExampleConfigForm. */ namespace Drupal\configform_example\Form; use Drupal\Core\Form\ConfigFormBase; use Drupal\Core\Form\FormStateInterface; class ConfigFormExampleConfigForm extends ConfigFormBase { /** * {@inheritdoc}. */ public function getFormId() { return 'configform_example_form'; } /** * {@inheritdoc}. */ public function buildForm(array $form, FormStateInterface $form_state) { $form = parent::buildForm($form, $form_state); $config = $this->config('configform_example.settings'); $form['email'] = [ '#type' => 'email', '#title' => $this->t('Your .com email address.'), '#default_value' => $config->get('email_address'), ]; return $form; } /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { if (strpos($form_state->getValue('email'), '.com') === FALSE ) { $form_state->setErrorByName('email', $this->t('This is not a .com email address.')); } } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $config = $this->config('configform_example.settings'); $config->set('email_address', $form_state->getValue('email')); $config->save(); return parent::submitForm($form, $form_state); } /** * {@inheritdoc} */ protected function getEditableConfigNames() { return ['configform_example.settings']; } }
提交一个新的 email,存储在配置内。模块的 configform_example.settings.yml 文件不会变化,但你可以导出 configform_example.settings 配置,之后把它导入到其他站点。
使用预先写好的代码
象之前描述的那样,一个实用的方法是使用之前写好的代码作为新工作的起点。可以在第 1 课创建的 page_example 模块基础上修改代码。
Examples project: configform_example.links.menu.yml
configform_example.form: title: Config Form Example route_name: configform_example_form parent: system.admin_reports
为 configform_example 模块进行 YAML 配置
把以下两个配置文件放在 configform_example 模块目录根下。
configform_example.info.yml:
name: Config Form example type: module description: 'An example module showing how to define a configuration form to be displayed at a given URL.' package: Example modules core: 8.x
configform_example.routing.yml:
configform_example_form: path: 'examples/configform_example/form' defaults: _form: '\Drupal\configform_example\Form\ConfigFormExampleConfigForm' _title: 'Config Form' requirements: _permission: 'access simple page'
配置监测器
drupal.org 上写道“Configuration inspector for Drupal 8 使用了核心内置的配置和模式系统,使你能够监测配置值及模式的使用情况。使开发者能够集中查看所有配置值,并进行多种测试、核实任务。”
安装这个模块后,你会在我们的自定义配置项后面看到“raw data”这个链接,但“列表”、"TREE"、"表单"几项链接没有。为了解决这个你可以为设置增加下模式定义,./config/schema/configform_example.schema.yml:
configform_example.settings: type: mapping label: 'Configform Example settings' mapping: email_address: type: string label: 'This is the example email address.'
重新安装下 configform_example 模块,再看下上面的几个链接。