弊社での新規案件はほぼ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.module
はhook_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
に定義した初期値が反映されています。
設定を保存すると、コンフィグにも反映されます。
設定を有効化した状態で、ノードを表示すると正しくメッセージが表示されていることが分かります。
試しにメッセージを変更すると…ノード表示の際も変更したメッセージが表示されます。
設定の同期(/admin/config/development/configuration)画面のエクスポートで、以下のようにコンフィグの内容が表示されエクスポートが可能です。
表示された内容をymlファイルへ保存したり、他のサイトのDrupalへインポートすることが可能です。
簡単ではありますが、Configuration schemaの活用についてご紹介しました。
hook_schema()
でDBのテーブルを定義するより簡単に利用できますので、是非活用してみてください。
募集しています
スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。