目次
Drupal 8のサービスコンテナは、Drupalアプリケーションでグローバルに使用されるサービスの作成を管理する重要なコンポーネントです。各サービスが一度だけインスタンス化され、メモリを保存し、パフォーマンスが向上することが保証されます。また、サービスコンテナは、あるオブジェクトが別のオブジェクトに依存関係を提供できるようにするデザインパターンである依存関係インジェクションを処理します。これにより、コードがよりモジュール化され、テストが容易になり、より良い組織が促進されます。
Drupal 8で新しいサービスを定義する方法は?
Drupal 8の構成管理の目的は何ですか?
Drupal 8でサービスを上書きするには、モジュールの
Drupal 8の構成管理システムは、構成スナップショットシステムを介してサイト構成の変更を追跡する方法を提供します。このシステムは、構成データをインポートまたは同期するたびに、サイトのアクティブな構成のスナップショットを取得します。その後、これらのスナップショットを比較して、どのような変更が行われたかを確認できます。
ホームページ バックエンド開発 PHPチュートリアル Drupal 8モジュール - 構成管理とサービスコンテナ

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

Feb 21, 2025 am 10:17 AM

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

PHP 8.1の列挙(列挙)とは何ですか? PHP 8.1の列挙(列挙)とは何ですか? Apr 03, 2025 am 12:05 AM

php8.1の列挙関数は、指定された定数を定義することにより、コードの明確さとタイプの安全性を高めます。 1)列挙は、整数、文字列、またはオブジェクトであり、コードの読みやすさとタイプの安全性を向上させることができます。 2)列挙はクラスに基づいており、トラバーサルや反射などのオブジェクト指向の機能をサポートします。 3)列挙を比較と割り当てに使用して、タイプの安全性を確保できます。 4)列挙は、複雑なロジックを実装するためのメソッドの追加をサポートします。 5)厳密なタイプのチェックとエラー処理は、一般的なエラーを回避できます。 6)列挙は魔法の価値を低下させ、保守性を向上させますが、パフォーマンスの最適化に注意してください。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

REST APIデザインの原則とは何ですか? REST APIデザインの原則とは何ですか? Apr 04, 2025 am 12:01 AM

Restapiの設計原則には、リソース定義、URI設計、HTTPメソッドの使用、ステータスコードの使用、バージョンコントロール、およびHATEOASが含まれます。 1。リソースは名詞で表され、階層で維持される必要があります。 2。HTTPメソッドは、GETを使用してリソースを取得するなど、セマンティクスに準拠する必要があります。 3.ステータスコードは、404など、リソースが存在しないことを意味します。 4。バージョン制御は、URIまたはヘッダーを介して実装できます。 5。それに応じてリンクを介してhateoasブーツクライアント操作をブーツします。

PHPで例外を効果的に処理する方法(試して、キャッチ、最後に、スロー)? PHPで例外を効果的に処理する方法(試して、キャッチ、最後に、スロー)? Apr 05, 2025 am 12:03 AM

PHPでは、Try、Catch、最後にキーワードをスローすることにより、例外処理が達成されます。 1)TRYブロックは、例外をスローする可能性のあるコードを囲みます。 2)キャッチブロックは例外を処理します。 3)最後にブロックは、コードが常に実行されることを保証します。 4)スローは、例外を手動でスローするために使用されます。これらのメカニズムは、コードの堅牢性と保守性を向上させるのに役立ちます。

PHPの匿名クラスとは何ですか?また、いつ使用できますか? PHPの匿名クラスとは何ですか?また、いつ使用できますか? Apr 04, 2025 am 12:02 AM

PHPの匿名クラスの主な機能は、1回限りのオブジェクトを作成することです。 1.匿名クラスでは、名前のないクラスをコードで直接定義することができます。これは、一時的な要件に適しています。 2。クラスを継承したり、インターフェイスを実装して柔軟性を高めることができます。 3.使用時にパフォーマンスとコードの読みやすさに注意し、同じ匿名のクラスを繰り返し定義しないようにします。

See all articles