ホームページ > バックエンド開発 > PHPチュートリアル > Drupal 8モジュール - 構成管理とサービスコンテナ

Drupal 8モジュール - 構成管理とサービスコンテナ

Christopher Nolan
リリース: 2025-02-21 10:17:09
オリジナル
1005 人が閲覧しました

Drupal 8 Modules - Configuration Management and the Service Container

コアポイント

  • Drupal 8のクラスは、構成システムと対話するための追加の機能を提供し、ツールがフォームを保存された値に変換できるようにします。これは、拡張クラスをConfigFormBaseに置き換え、フォームに必要な変更を加えることで実行できます。 Drupal 8の構成はYAMLファイルに保存され、異なるサイトに展開するためにUIを介して変更できます。 ConfigFormBase
  • Drupal 8のサービスコンテナにより、サービスの作成、つまりグローバルオペレーションを実行し、アクセスのためにサービスコンテナに登録するPHPクラスを作成できます。依存関係注入は、オブジェクトを他のオブジェクトに渡すために使用され、分離を確保します。モジュールのルートディレクトリに
  • ファイルを作成して、サービスを登録できます。 demo.services.yml Drupal 8での依存関係注入は、あるオブジェクトが別のオブジェクトに依存関係を提供できるようにする設計パターンであり、コードのテストがよりモジュール化されやすくなります。これは、
  • クラスを拡張するか、
  • を実装することで実現できます。また、ControllerBaseクラスを使用して、グローバルにサービスにアクセスすることもできます。 ContainerInjectionInterface Drupal
Drupal 8が執筆時点で開発中であるため、一部のコードパーツが時代遅れになる可能性があることに注意してください。このリポジトリをチェックしてください。サンプルコードを更新して、最新のDrupal 8バージョンと互換性のあるものにしようとしました。

Drupal 8モジュール開発に関する以前の記事では、ブロックタイプとフォームの作成を検討しました。ブロックが再利用可能であり、ブロックタイプを定義するために必要なすべてが1つのクラスで行われることがわかりました。同様に、フォーム生成関数は、特定の方法で実行されるタスクがDrupal 7で慣れているタスクと同様のクラスにもグループ化されます。

このチュートリアルでは、前回終了した場所から続けます。 Drupal 8構成システムを介して値を保存するために使用されるフォームに

を変換する方法について説明します。その後、サービスコンテナと依存噴射を例で説明します。

このチュートリアルシリーズに記載されているすべてのコードを取得したい場合は、このリポジトリをご覧ください。 DemoForm

構成フォーム

を定義したとき、

クラスを拡張しました。これはDemoFormの最も簡単な実装です。ただし、Drupal 8にはA FormBaseも付属しており、構成システムとの対話を非常に簡単にする追加機能をいくつか提供します。 FormInterface ConfigFormBase私たちが今しなければならないことは、

をユーザーが入力した電子メールアドレスを保存するフォームに変換することです。最初にすべきことは、拡張クラスを

(そしてもちろんDemoForm it)に置き換えることです:ConfigFormBase

use Drupal\Core\Form\ConfigFormBase;

class DemoForm extends ConfigFormBase {
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

フォームの残りの部分を変更し続ける前に、Drupal 8の作業の単純な構成を見てみましょう。より複雑な構成エンティティがあるため、「シンプル」と言いましたが、今日は紹介しません。今のところ、モジュール(コアまたはコントリブ)によって提供される構成は、YAMLファイルに保存されています。モジュールが有効になっている場合、このデータはデータベースにインポートされます(使用するとパフォーマンスを改善するため)。 UIを使用すると、この構成を変更してから、異なるサイトに展開するためにYAMLファイルに簡単にエクスポートできます。

モジュールは、モジュールルートディレクトリのフォルダーのYAMLファイルにデフォルトの構成を提供できます。このファイルの命名規則は、モジュールの名前をプレフィックスすることです。それでは、config/installというファイルを作成しましょう。このファイルでは、以下を貼り付けましょう demo.settings.yml

これはネストされた構造です(PHPの連想配列など)。
demo:
  email_address: demo@demo.com
ログイン後にコピー
ログイン後にコピー
キーの下には、別のキー値ペアがあります。通常、これらのネストされた値にアクセスするには、ドット(。)を使用します。私たちの場合、それは

です。 demo このファイルがあると、覚えておく必要がある重要なことの1つは、このファイルがモジュールがインストールされたときにのみインポートされることです。したがって、再インストールし続けてください。これで、フォームに戻って、調整する必要がある方法を1つずつ見ることができます。 demo.email_address

これは、

メソッドが次のように見えるものです

最初に、

に反して、buildForm()クラスは、フォームアレイに要素を追加するためにこの方法を実装します([送信]ボタン)。そのため、独自の要素を追加する前に、親クラスの前にしたことを使用できます。

public function buildForm(array $form, array &$form_state) {

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

  $config = $this->config('demo.settings');

  $form['email'] = array(
    '#type' => 'email',
    '#title' => $this->t('Your .com email address.'),
    '#default_value' => $config->get('demo.email_address')
  );

  return $form;
}
ログイン後にコピー
ログイン後にコピー
構成セクションの場合。 Drupal 8は、構成と対話するために使用できる

オブジェクトを提供します。一部のクラスでは、依存噴射を通じてそれを取得しています。 FormBaseこれはそのようなクラスです。 ConfigFormBase

ご覧のとおり、親クラスの

メソッドを使用して、Configシンプルな構成が入力されているConfigFormBaseオブジェクトを取得しています。次に、電子メールフォーム要素の

について、config()オブジェクトのConfigメソッドを使用して、電子メールアドレスの値を取得します。 demo.settings #default_value次に、Configメソッドが同じままになることができるため、コミットハンドラーを変更する必要があります。 get() この方法では、最初に構成した

オブジェクトを取得します(以前と同じように)。次に、その

メソッドを使用して、validateForm()の値をユーザーがサビされた値に変更します。次に、構成を保存するために

メソッドを使用します。最後に、一部の機能が含まれているため、親のコミットハンドラーを拡張します(この場合、Drupalメッセージを画面に設定します)。
public function submitForm(array &$form, array &$form_state) {

  $config = $this->config('demo.settings');
  $config->set('demo.email_address', $form_state['values']['email']);
  $config->save();

  return parent::submitForm($form, $form_state);
}
ログイン後にコピー

それだけです。キャッシュをクリアして試してみることができます。新しいメールアドレスを送信することにより、構成に保存します。 demo.settings.ymlファイルは確かに変更されませんが、demo.settings構成をエクスポートして別のサイトにインポートできます。

サービスコンテナと依存関係噴射

次に見たいのは、サービスコンテナです。サービスの背後にある哲学は、機能を再利用可能なコンポーネントに分解することです。したがって、サービスは、アクセスのためにいくつかのグローバルな操作とサービスコンテナに登録するPHPクラスです。

依存関係注射は、オブジェクトを渡して分離を確保する方法です。各サービスは1つのものを処理する必要があり、別のサービスが必要な場合は、後者を前者に注入できます。しかし、すぐにそれを行う方法がわかります。

次に、非常に簡単なサービスを作成し、コンテナに登録します。単純な値を返す実際の方法は1つしかありません。次に、サービスをDemoControllerに依存関係として注入し、サービスが提供する値を使用します。

サービスを登録するには、モジュールのルートディレクトリにある

ファイルを作成する必要があります。次のコンテンツがあります。 demo.services.yml

ファイルの命名規則は
use Drupal\Core\Form\ConfigFormBase;

class DemoForm extends ConfigFormBase {
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
です。

module_name.services.yml最初の行は、サービスの配列を作成します。 2番目の行は、最初のサービス(モジュール名で接頭辞と呼ばれる)を定義します。 3行目は、このサービスのためにインスタンス化されるクラスを指定します。次に、モジュールの

フォルダーに

クラスファイルを作成することです。これは私のサービスが行うことです(実際には何もありません。それを使用する方法を説明するだけです):demo_service src/ DemoService.phpここでは、非常に基本的なものであるため、ここで説明する必要はありません。次に、私たちの

に目を向けて、このサービスを使用しましょう。これを2つの方法で行うことができます。
demo:
  email_address: demo@demo.com
ログイン後にコピー
ログイン後にコピー
クラスを介してグローバルにコンテナにアクセスするか、依存関係噴射を使用してこのクラスのオブジェクトをコントローラーに渡すことです。ベストプラクティスは、2番目のアプローチをとる必要があることを示唆しているので、それが私たちがやろうとしていることです。ただし、サービスへのグローバルアクセスが必要な場合があります。これを行うには、次のことを行うことができます

DemoControllerNowDrupalは、作成したばかりのクラスのオブジェクトです。ただし、

クラスの依存関係としてサービスを挿入する方法を見てみましょう。最初に何をする必要があるかを説明します。次に、すべての変更が行われた完全なコントローラーが表示されます。
public function buildForm(array $form, array &$form_state) {

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

  $config = $this->config('demo.settings');

  $form['email'] = array(
    '#type' => 'email',
    '#title' => $this->t('Your .com email address.'),
    '#default_value' => $config->get('demo.email_address')
  );

  return $form;
}
ログイン後にコピー
ログイン後にコピー

最初に、サービスコンテナにアクセスする必要があります。これは、コントローラーにとって非常に簡単です。他のヘルパープログラムに加えて、これを提供する$serviceクラスを拡張できます。または、コントローラーがDemoServiceを実装することもできます。これにより、コンテナにアクセスすることもできます。しかし、私たちはDemoControllerに固執するので、クラスが必要です。

次に、コントローラーの別のオブジェクトをインスタンス化し、必要なサービスに合格するuseメソッドの要件としてContainerInterfacesymfony 2create()が必要です。

最後に、合格したサービスオブジェクト(create()の返されたオブジェクト)を取得するためのコンストラクターが必要になり、後で使用するためにプロパティに割り当てる必要があります。 create()メソッドを返す順序は、オブジェクトがコンストラクターに渡される順序を反映する必要があります。

では、変更されたDemoController

を見てみましょう
use Drupal\Core\Form\ConfigFormBase;

class DemoForm extends ConfigFormBase {
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ご覧のとおり、すべての手順はここにあります。 create()メソッドは、コントローラークラスの新しいインスタンスを作成し、コンテナから取得したサービスを渡します。最後に、クラスのインスタンスはDemoServiceプロパティに保存されます。これは、その$demoServiceメソッドを呼び出すために使用できます。この値は、「Hello」メッセージで使用されます。キャッシュをクリアして、試してみてください。 getDemoValue()パスに移動すると、「hello upchuk!」が表示されます。 demo/

デカップルされた関数を書き、必要に応じてそれらを渡すことができるので、サービスコンテナの力を見ることができると思います。私はあなたにそれを行う方法を示していませんが、あなたはサービスに登録するときに依存関係を宣言することができます。これは、Drupalがサービスオブジェクトをインスタンス化すると、そのすべての依存関係に対してそれを行い、それらをコンストラクターに渡すことを意味します。このドキュメントページでこれを行う方法の詳細を読むことができます。

結論 この記事では、たくさんのクールなものを見ました。構成システムが単純な構成をどのように管理し、これにどのような「フォーム」機能が提供されるかを見てきました。

の実装方法と、拡張時に使用できる機能を探ることをお勧めします。さらに、UIのサイト間でインポート/エクスポート構成の使用を練習する必要があります。これからは、これは展開プロセスにとって大きな改善になります。

ConfigFormBase次に、サービス、それらが何であるか、どのように機能するかを調べました。どこからでもアクセスできる再利用可能で分離された機能ブロックを維持するための素晴らしい方法。依存噴射の概念がもはや怖くないことを願っています(それがあなたのためであれば)。基本的には、パラメーターを手続き上の関数に渡すことと同じですが、Symfonyとその強力なサービスコンテナがコンストラクターメソッド(またはセッター)を使用して舞台裏で行われます。

Building Drupal 8モジュールに関するよくある質問:構成管理とサービスコンテナ

Drupal 8のサービスコンテナの役割は何ですか?

Drupal 8のサービスコンテナは、Drupalアプリケーションでグローバルに使用されるサービスの作成を管理する重要なコンポーネントです。各サービスが一度だけインスタンス化され、メモリを保存し、パフォーマンスが向上することが保証されます。また、サービスコンテナは、あるオブジェクトが別のオブジェクトに依存関係を提供できるようにするデザインパターンである依存関係インジェクションを処理します。これにより、コードがよりモジュール化され、テストが容易になり、より良い組織が促進されます。

Drupal 8で新しいサービスを定義する方法は?

Drupal 8で新しいサービスを定義するには、モジュールのルートディレクトリにservices.ymlファイルを作成する必要があります。このファイルには、サービスの名前、クラス、およびパラメーターが含まれている必要があります。このクラスは、サービスを実装するクラスの完全に適格な名前である必要があり、パラメーターはサービスが依存するサービスまたはパラメーターである必要があります。

Drupal 8の構成管理の目的は何ですか?

Drupal 8の構成管理は、一貫した方法でサイト構成データを管理できるシステムです。構成データをインポート、エクスポート、および同期することができます。これは、開発環境から生産サイトへの構成変更を移動するときに役立ちます。また、時間の経過とともにサイト構成の変更を追跡および管理する方法も提供します。

構成管理システムを使用して構成データをエクスポートおよびインポートする方法は?

Drupal 8で構成データをエクスポートするには、管理パネルの構成管理インターフェイスを使用するか、Drushコマンドを使用できます。エクスポートされたデータはYAML形式であり、簡単に読み取って編集できます。構成データをインポートするには、構成管理インターフェイスを介してエクスポートしたYAMLファイルをアップロードするか、Drushコマンドを使用できます。潜在的なデータの損失を防ぐために、構成データをインポートする前にサイトをバックアップすることを忘れないでください。

依存噴射とは何ですか?また、Drupal 8でそれが重要なのはなぜですか?

依存関係注入は、あるオブジェクトが別のオブジェクトに依存関係を提供できるようにする設計パターンです。 Drupal 8では、サービスとコントローラーをよりモジュール化し、テストしやすくするために使用されます。オブジェクト内に依存関係を作成する代わりに、コンストラクターまたはセッターメソッドを介して渡されます(注入)。これにより、コードのテストが容易になり、柔軟性が高まり、結合が少なくなります。

Drupal 8サービスに依存関係を注入する方法は?

drupal 8のサービスに依存関係を挿入するには、

ファイルのサービスの定義でそれらを定義する必要があります。依存関係は、services.ymlキーの下にリストする必要があります。サービスが作成されると、サービスコンテナはこれらの依存関係を自動的にサービスのコンストラクターに渡します。 arguments

Drupal 8のサービスとプラグインの違いは何ですか?

Drupal 8では、サービスはアプリケーションでグローバルタスクを実行するオブジェクトであり、プラグインはプラグ可能な方法で特定のタスクを実行するオブジェクトです。サービスは

ファイルで定義され、サービスコンテナによって管理されますが、プラグインはプラグインマネージャーによって発見され、インスタンス化されます。

services.ymlDrupal 8のサービスをオーバーライドする方法は?

Drupal 8でサービスを上書きするには、モジュールの

ファイルで上書きするサービスと同じ名前のサービスを定義する必要があります。新しいサービスは、元のサービスのクラスを拡張し、変更する方法をオーバーライドする必要があります。

services.yml構成管理システムを使用して、サイト構成の変更を追跡する方法は?

Drupal 8の構成管理システムは、構成スナップショットシステムを介してサイト構成の変更を追跡する方法を提供します。このシステムは、構成データをインポートまたは同期するたびに、サイトのアクティブな構成のスナップショットを取得します。その後、これらのスナップショットを比較して、どのような変更が行われたかを確認できます。

services.ymlDrupal 8でファイルは何をしますか?

DRUPAL 8のservices.ymlファイルは、モジュールサービスが定義されている場所です。各サービスは、一意の名前、サービスを実装するクラスの完全に適格な名前、およびサービスが依存するサービスまたはパラメーターを使用して定義されます。 services.ymlファイルはサービスコンテナによって読み取られ、サービスコンテナはサービスの作成と注入を管理します。

以上がDrupal 8モジュール - 構成管理とサービスコンテナの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート