web-dev-qa-db-ja.com

グローバルクラス\ Drupal静的メソッドを使用してサービスにアクセスするにはどうすればよいですか?

\Drupal::service('config.factory')\Drupal::configFactory()の呼び出しに違いはありますか?

2番目のものを使用する方が良いですか?

できる \Drupalサービスの呼び出し以外の目的で使用されますか?

ドキュメントは言う:

グローバル関数でのサービスへのアクセス

グローバルDrupalクラスは、最も一般的なサービスのいくつかにアクセスするための静的メソッドを提供します。たとえば、Drupal :: moduleHandler()はモジュールハンドラーサービスを返すか、Drupal :: translation()は文字列変換サービス。使用するサービスに専用のメソッドがない場合は、Drupal :: service()メソッドを使用して、定義済みのサービスを取得できます。

専用の方法はありませんか?取得可能なすべてのサービスを簡単にリストするにはどうすればよいですか?

4
Matoeil

\Drupal::configFactory()\Drupal::service('config.factory')よりも短いです。 \Drupal::configFactory()を使用しても、モジュール内のサービス名をハードコーディングしていないという事実は、おそらくそれを選択する理由ではありません。これは、ほとんどのサービス名をハードコードしているためです(専用メソッドでは、 Drupal 8の安定版リリースにより、利用可能なすべてのサービスの4分の1をカバーすることもできません)、サービス名が変更される可能性は低くなります。
モジュールで使用しているサービスに専用のメソッドがある場合、その専用のメソッドを使用することを好み、_\Drupal_が持つ静的メソッドを使用するよりも依存性注入を使用することを好みます。

\ Drupalクラスの目的は、Drupalまたはサードパーティのモジュールから提供されるサービスへのアクセスを提供することです。 \Drupal::request() でもサービスのしたがって、サービスではないものに\ Drupalを使用することはありません。この場合でも、依存性注入を使用できる場合は、そのクラスに依存しないでください。

モジュールによって実装されるサービスのリストについては、コアモジュールを含む、モジュールで提供される.services.ymlファイルを確認する必要があります。これらのファイルは、モジュールによって実装されたサービスのリストを提供します。すべてのモジュールが必要なすべてのサービスを実装できるため、完全なリストを提供することは不可能です。

1
kiamlaluno

\Drupal::service('config.factory')\Drupal::configFactory()は同等です。 2番目はちょうど短いです。

コアによって提供される多くのサービスがあり、そのうちのいくつかだけが専用のメソッドを持っています。 core.services.yml page でコアサービスのリストを取得できます。これはコアが提供するすべてのサービスではないことに注意してください。たとえば、 ser.services.yml にはより多くのサービスがあります。

また、クラスを操作する場合は、静的メソッドを呼び出すよりも、依存性注入を使用する方がよいことにも注意してください。静的メソッドは手続き型コードで呼び出す必要があります(D8では、これは基本的にフックまたはAPI関数を意味します)。

これはスライドショーです 今月、Drupal Camp Tokyoで依存関係注入に関するプレゼンテーションを行うときに使用しました。

6
Jaypan