コアポイント
ConfigFormBase
に置き換え、フォームに必要な変更を加えることで実行できます。 Drupal 8の構成はYAMLファイルに保存され、異なるサイトに展開するためにUIを介して変更できます。 ConfigFormBase
demo.services.yml
Drupal 8での依存関係注入は、あるオブジェクトが別のオブジェクトに依存関係を提供できるようにする設計パターンであり、コードのテストがよりモジュール化されやすくなります。これは、ControllerBase
クラスを使用して、グローバルにサービスにアクセスすることもできます。 ContainerInjectionInterface
Drupal
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
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; }
オブジェクトを提供します。一部のクラスでは、依存噴射を通じてそれを取得しています。 FormBase
これはそのようなクラスです。 ConfigFormBase
メソッドを使用して、Config
シンプルな構成が入力されているConfigFormBase
オブジェクトを取得しています。次に、電子メールフォーム要素の
について、config()
オブジェクトのConfig
メソッドを使用して、電子メールアドレスの値を取得します。 demo.settings
#default_value
次に、Config
メソッドが同じままになることができるため、コミットハンドラーを変更する必要があります。
get()
この方法では、最初に構成した
メソッドを使用して、validateForm()
の値をユーザーがサビされた値に変更します。次に、構成を保存するために
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
ここでは、非常に基本的なものであるため、ここで説明する必要はありません。次に、私たちの
demo: email_address: demo@demo.com
DemoController
NowDrupal
は、作成したばかりのクラスのオブジェクトです。ただし、
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
メソッドの要件としてContainerInterface
symfony 2create()
が必要です。
最後に、合格したサービスオブジェクト(create()
の返されたオブジェクト)を取得するためのコンストラクターが必要になり、後で使用するためにプロパティに割り当てる必要があります。 create()
メソッドを返す順序は、オブジェクトがコンストラクターに渡される順序を反映する必要があります。
では、変更されたDemoController
:
use Drupal\Core\Form\ConfigFormBase; class DemoForm extends ConfigFormBase {
ご覧のとおり、すべての手順はここにあります。 create()
メソッドは、コントローラークラスの新しいインスタンスを作成し、コンテナから取得したサービスを渡します。最後に、クラスのインスタンスはDemoService
プロパティに保存されます。これは、その$demoService
メソッドを呼び出すために使用できます。この値は、「Hello」メッセージで使用されます。キャッシュをクリアして、試してみてください。 getDemoValue()
パスに移動すると、「hello upchuk!」が表示されます。 demo/
結論 この記事では、たくさんのクールなものを見ました。構成システムが単純な構成をどのように管理し、これにどのような「フォーム」機能が提供されるかを見てきました。
の実装方法と、拡張時に使用できる機能を探ることをお勧めします。さらに、UIのサイト間でインポート/エクスポート構成の使用を練習する必要があります。これからは、これは展開プロセスにとって大きな改善になります。
ConfigFormBase
次に、サービス、それらが何であるか、どのように機能するかを調べました。どこからでもアクセスできる再利用可能で分離された機能ブロックを維持するための素晴らしい方法。依存噴射の概念がもはや怖くないことを願っています(それがあなたのためであれば)。基本的には、パラメーターを手続き上の関数に渡すことと同じですが、Symfonyとその強力なサービスコンテナがコンストラクターメソッド(またはセッター)を使用して舞台裏で行われます。
Drupal 8のサービスコンテナの役割は何ですか?
Drupal 8で新しいサービスを定義するには、モジュールのルートディレクトリにservices.yml
ファイルを作成する必要があります。このファイルには、サービスの名前、クラス、およびパラメーターが含まれている必要があります。このクラスは、サービスを実装するクラスの完全に適格な名前である必要があり、パラメーターはサービスが依存するサービスまたはパラメーターである必要があります。
構成管理システムを使用して構成データをエクスポートおよびインポートする方法は?
依存噴射とは何ですか?また、Drupal 8でそれが重要なのはなぜですか?
Drupal 8サービスに依存関係を注入する方法は?
ファイルのサービスの定義でそれらを定義する必要があります。依存関係は、services.yml
キーの下にリストする必要があります。サービスが作成されると、サービスコンテナはこれらの依存関係を自動的にサービスのコンストラクターに渡します。 arguments
services.yml
Drupal 8のサービスをオーバーライドする方法は?
services.yml
構成管理システムを使用して、サイト構成の変更を追跡する方法は?
services.yml
Drupal 8でファイルは何をしますか? DRUPAL 8のservices.yml
ファイルは、モジュールサービスが定義されている場所です。各サービスは、一意の名前、サービスを実装するクラスの完全に適格な名前、およびサービスが依存するサービスまたはパラメーターを使用して定義されます。 services.yml
ファイルはサービスコンテナによって読み取られ、サービスコンテナはサービスの作成と注入を管理します。
以上がDrupal 8モジュール - 構成管理とサービスコンテナの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。