Drupal 8 模块开发 3.2 : 配置和 Config 对象

蒲公英 提交于 周四, 08/17/2017 - 15:33
Drupal8模块开发

原文地址:
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 模块,再看下上面的几个链接。