弊社での新規案件はほぼDrupal8で開発することが多く、Drupal8を活用していくノウハウが日々蓄積されております。
そんな中、今回はDrupal8のConfiguration schemaについて実装を交えつつご紹介したいと思います

Configuration schemaとは??

Drupal公式のドキュメントはこちらにあります。
https://www.drupal.org/docs/8/api/configuration-api/configuration-schemametadata

私の理解としては、Drupal7時代に hook_schema()variable モジュールで定義していた、 カスタムモジュールに関する設定等を保存する為のものと考えています。

Configuration schemaを利用するメリットは??

Configuration schemaを利用すると「設定の同期」(/admin/config/development/configuration)より設定のインポート/エクスポートが 出来るようになりますので、変更を加える前のバックアップやカスタムモジュールの設定データの移行等に役立てることが出来ます。

サンプルモジュールを作ってみよう

早速、Configuration schemaを利用したサンプルモジュールを作成していきます。
サンプルモジュールは「ノードを開いた際、匿名ユーザであれば任意のメッセージを表示する」というシンプルなものです。

1.モジュール構成

サンプルモジュールの構成は以下になります。

d8_config_example
├─ config
│ ├─ install
│ │ └─ d8_config_example.settings.yml
│ └─ schema
│    └─ d8_config_example.schema.yml
├─ d8_config_example.info.yml
├─ d8_config_example.module
├─ d8_config_example.routing.yml
└─ src
   └─ Form
     └─ Settings.php

当モジュールで重要となるファイルは以下の4つです。

  • config/install/d8_config_example.settings.yml は該当コンフィグの初期値を設定するymlファイル
  • config/schema/d8_config_example.schema.yml は該当コンフィグの定義を設定するymlファイル
  • src/Form/Settings.php はコンフィグの情報を取得/保存する為の設定画面のフォーム
  • d8_config_example.modulehook_ENTITY_TYPE_view() を利用し、ノードを開いた際にコンフィグに保存したメッセージを表示

2.d8_config_example.schema.yml ファイルについて

当ファイルはコンフィグの内容を定義する為のymlファイルです。
type: の定義については こちら をご参照ください。

d8_config_example.settings: # コンフィグ名(他のモジュール等と被らないようモジュール名を付与します)
  type: config_object       # ↑で定義したもののタイプ(先頭は必ず config_object )
  label: 'Configuration schema example' # 任意のラベル
  mapping:  # コンフィグに紐付くキーを定義します
    module_enabled:   # キー名
      type: boolean   # 該当キーのタイプ
      label: 'This module enabled'  # 任意のラベル
    message:          # キー名
      type: string    # 該当キーのタイプ
      label: 'Display Message'  # 任意のラベル

3.d8_config_example.settings.yml ファイルについて

当ファイルは定義したコンフィグのキーの初期値を設定する為のymlファイルです。
ファイル名は コンフィグ名.yml に設定する必要があります。

# "キー名: 値" の形式で記載します
module_enabled: false
message: 'これは初期メッセージです。'

4.Settings.php ファイルについて

当ファイルはコンフィグの情報を取得/保存する為の設定画面のフォームです。
継承元の親クラス( ConfigFormBase )にコンフィグ情報を読み書きする為の config.factory がロードされている為
ここでは $this->config('コンフィグ名') で定義したコンフィグの情報を取得し get()set() で簡単に操作できます。

<?php

/**
 * @file
 * Configuration schemaに対し設定情報の読み込み/保存を行うフォーム.
 */

namespace Drupal\d8_config_example\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Class Settings
 *
 * @package Drupal\d8_config_example\Form
 */
class Settings extends ConfigFormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'd8_config_example_settings';
  }

  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames() {
    // 編集可能なコンフィグの名称.
    return ['d8_config_example.settings'];
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    // 対象のコンフィグ情報を取得.
    $config = $this->config('d8_config_example.settings');

    $form =  parent::buildForm($form, $form_state);

    $form['module_enabled'] = [
      '#type' => 'checkbox',
      '#title' => '当モジュールの機能を有効化',
      '#default_value' => $config->get('module_enabled'), // コンフィグ内の該当するキーの内容を取得.
    ];

    $form['display_message'] = [
      '#type' => 'textfield',
      '#title' => 'メッセージ',
      '#default_value' => $config->get('message'), // コンフィグ内の該当するキーの内容を取得.
      '#maxlength' => 255,
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    parent::submitForm($form, $form_state);

    // 該当するコンフィグのキーにフォームの入力内容を保存.
    $this->config('d8_config_example.settings')
      ->set('module_enabled', $form_state->getValue('module_enabled'))
      ->set('message', $form_state->getValue('display_message'))
      ->save();
  }

}

5.d8_config_example.module ファイルについて

ノードを開いた際に、匿名ユーザ且つモジュールの設定が有効であればメッセージを表示する処理です。
Form以外で利用する際も \Drupal::config('コンフィグ名') で簡単にコンフィグの情報を取得し get() でキーの内容を容易に取得することができます。

<?php

use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;

/**
 * Implements hook_ENTITY_TYPE_view().
 */
function d8_config_example_node_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) {
  // コンフィグの情報を取得.
  $config = \Drupal::config('d8_config_example.settings');
  $current_user = \Drupal::currentUser();

  if ($current_user->isAnonymous() && $config->get('module_enabled')) {
    // コンフィグ内の該当するキーの内容を取得.
    drupal_set_message($config->get('message'));
  }
}

サンプルモジュールの実行結果

設定画面は以下のシンプルなフォームが表示されます。
d8_config_example.settings.yml に定義した初期値が反映されています。

d8-config-example1

設定を保存すると、コンフィグにも反映されます。

d8-config-example1

設定を有効化した状態で、ノードを表示すると正しくメッセージが表示されていることが分かります。

d8-config-example1

試しにメッセージを変更すると…ノード表示の際も変更したメッセージが表示されます。

d8-config-example1

設定の同期(/admin/config/development/configuration)画面のエクスポートで、以下のようにコンフィグの内容が表示されエクスポートが可能です。
表示された内容をymlファイルへ保存したり、他のサイトのDrupalへインポートすることが可能です。

d8-config-example1

簡単ではありますが、Configuration schemaの活用についてご紹介しました。
hook_schema() でDBのテーブルを定義するより簡単に利用できますので、是非活用してみてください。


共に働く新しい仲間を
募集しています

スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。