シンプル設定API
このページでは、シンプル設定の設定データを取得および設定するためのAPIについて説明します。(これは設定オブジェクトに保存されている情報に関するものではありません。)
設定データ
各モジュールはデフォルト設定を提供できます。たとえば、メンテナンスモードの設定はcore/modules/system/config/install/system.maintenance.ymlで定義されています。このファイルでは、最初の部分はこの設定を提供したモジュール(この例ではシステムモジュール)を表す名前空間で、その後にサブシステム(この例ではメンテナンス)が続きます。ファイルはconfig/installディレクトリにある必要があります。また、ConfigBase->validateName($name)での検証のために、ファイル名に「.」記号を含める必要があります。このファイルには次のYAMLが含まれています:
message: '@site is currently under maintenance. We should be back shortly. Thank you for your patience.'
langcode: en
設定は、パフォーマンス設定(system.performance.yml)のようにネストすることもできます:
cache:
page:
enabled: '0'
max_age: '0'
preprocess:
css: '0'
js: '0'
response:
gzip: '0'
重要:ルートキーはマッピングである必要があります
設定のルートにあるデータは、予測できないシーケンスではなくマッピングとして表す必要があります。たとえば、使用可能な各エンティティタイプのデータを保存する場合は、親キーをエンティティタイプにし、ルートキーのentity_typeを追加します。以下のレイアウト例を参照してください:
entity_type:
commerce_order:
foo: 'bar'
node:
foo: 'bar'
user:
foo: 'bar'
エンティティタイプがルートキーの場合、スキーマを使用して設定を表すことはできません。さらに、Drupalコアは、設定がモジュール(またはテーマ)のインストールの一部としてインストールされたときに追加情報を追加できなくなります。
設定との対話
これらのファイルにはConfigオブジェクトを介して対話し、拡張子を除いたファイル名でconfig()関数を呼び出してConfigオブジェクトのインスタンスを作成します。config()関数の呼び出しは、\Drupal\Core\Config\ImmutableConfigのインスタンスを返します。
// Immutable Config (Read Only).
$config = \Drupal::config('system.performance');
// Mutable Config (Read / Write).
$config = \Drupal::service('config.factory')->getEditable('system.performance');
Configオブジェクトを取得したら、さまざまな方法で対話できます。
設定の読み取り
設定はget()メソッドを使用して読み取ります。これはいくつかの方法で使用できます。設定の一部を読み取るには、そのキーを指定するだけです。
$config = \Drupal::config('system.maintenance');
$message = $config->get('message');
\Drupal::config()の呼び出しもチェーンできます。
$message = \Drupal::config('system.maintenance')->get('message');
ネストされた設定を読み取るには、キーを「.」文字で区切ります。
$enabled = \Drupal::config('system.performance')->get('cache.page.enabled');
レベルの下に配列にネストされた設定がある限り、任意のレベルで設定を読み取ることができます。
$page_cache = \Drupal::config('system.performance')->get('cache.page');
これにより、「enabled」と「max_age」の2つのキーを持つ配列が返されます。
設定オブジェクト内のすべてのデータを返すには、引数なしでget()を呼び出します。
また、システムで利用可能なすべての設定キー、または特定の部分文字列(プレフィックス)で始まるキーのみを返すこともできます。
$keys = \Drupal::service('config.factory')->listAll($prefix = "");
設定の書き込み
設定を変更するには、設定ファクトリーでgetEditable()を呼び出して\Drupal\Core\Config\Config(変更可能な設定オブジェクト)のインスタンスを取得する必要があります。\Drupal\Core\Config\ImmutableConfigのインスタンスに対して変更を加えようとしたり、delete() / save()関数を呼び出したりすると、ImmutableConfigExceptionがスローされます。
これは次のように行われます:
\Drupal::service('config.factory')->getEditable('system.performance');
設定はset()メソッドで変更または追加され、save()メソッドで保存されます。設定は明示的に保存する必要があることに注意してください。設定にデータを設定するだけでは保存されません。
データの読み取りと同じ方法で、キーを参照して関連データを保存することで、設定オブジェクトにデータを保存します。構文は、以前のDrupalバージョンにあったvariable_set()と同じです。
$config = \Drupal::service('config.factory')->getEditable('system.performance');
// Set a scalar value.
$config->set('cache.page.enabled', 1);
// Set an array of values.
$page_cache_data = ['enabled' => 1, 'max_age' => 5];
$config->set('cache.page', $page_cache_data);
// Save your data to the database.
$config->save();
set()関数もチェーン可能なので、1つの値だけを変更する必要がある場合は、1行のコードで実行できます。
\Drupal::service('config.factory')->getEditable('system.performance')->set('cache.page.enabled', 1)->save();
設定オブジェクト内のすべてのデータを置き換えたい場合は、setData()関数を使用します。setData()を使用してデータのサブセットだけを置き換えることはできません。オブジェクト全体よりも少ないものを置き換えたい場合は、代わりに1つ以上のset()呼び出しを使用する必要があります。setData()を使用する場合、引数なしのget()が返す連想配列と同じ形式で各キーと値を指定する必要があります。system.performance.ymlのシステムパフォーマンス設定の場合、次のようになります:
// Set all values.
\Drupal::service('config.factory')->getEditable('system.performance')->setData([
'cache' => [
'page' => [
'enabled' => '0',
'max_age' => '0',
],
],
'preprocess' => [
'css' => '0',
'js' => '0',
],
'response' => [
'gzip' => '0',
],
])
->save();
設定の削除
個々の設定値は、これもチェーン可能なclear()関数を使用してリセットできます。
$config = \Drupal::service('config.factory')->getEditable('system.performance');
$config->clear('cache.page.max_age')->save();
$page_cache_data = $config->get('cache.page');
この例では、「max_age」が設定されていないため、$page_cache_dataは1つのキー(「enabled」)を持つ配列を返します。
設定セット全体はdelete()関数で削除できます。
\Drupal::service('config.factory')->getEditable('system.performance')->delete();
この後、save()関数を呼び出してはいけないことに注意してください。呼び出すと、設定セットの空のバージョンが作成されるためです。
ベストプラクティス
同じ関数内で設定オブジェクトのインスタンスを複数回作成することは避けてください。パフォーマンスが低下するためです。次のコードは、'foo.bar'設定オブジェクトのインスタンスを不必要に2回作成しています。
\Drupal::service('config.factory')->getEditable('foo.bar')->set('foo', 'foo')->save();
\Drupal::service('config.factory')->getEditable('foo.bar')->set('bar', 'bar')->save();
より良い解決策は、設定オブジェクトのインスタンスを1回作成して変数に保存し、コードの残りのスコープでその変数を操作することです。
$config = \Drupal::service('config.factory')->getEditable('foo.bar');
$config
->set('foo', 'foo')
->set('bar', 'bar')
->save();
サービスへの設定値の注入
設定値は、サービスファクトリーを使用してカスタムサービスに注入できます。
services:
app.service:
class: Drupal/mail_module/Service
factory: Drupal/mail_module/ServiceFactory:create
arguments: ['@config.factory']
class ServiceFactory {
static function create($config) {
return new Service($config->get('mail.config')->get('transport'));
}
}
class Service {
public function __construct($transport) {
$this->mailTransport = $transport;
}
}
例はサービスに設定値を注入するにはどうすればよいですか?から改作されました。