module_load_include()に相当するものは何ですか?


7

D7についてはかなりの経験がありますが、D8についてはあまり経験がないので、ここでD8を「適切な」方法で実行する方法について疑問に思っています。

だから私はModuleAとModuleBを持っています

ModuleBはModuleAに依存しています。

ModuleB内のModuleAから関数を呼び出す必要があります。

D7では、これはmodule_load_include()によって行われ、D8にはこの関数とModuleHandlerクラスの両方があるようです。

このクラスをインスタンス化してloadメソッドを使用しようとしていますが、コンストラクターに何も渡していないため、エラーがスローされます。

$ module_handler = new \ Drupal \ Core \ Extension \ ModuleHandler; $ module_handler-> load( 'ilib_connect');

TypeError: Argument 3 passed to Drupal\Core\Extension\ModuleHandler::__construct() must implement interface Drupal\Core\Cache\CacheBackendInterface, none given, called in /var/www/company/web/modules/custom/ilib_sso/ilib_sso.module on line 31 in Drupal\Core\Extension\ModuleHandler->__construct() (line 109 of core/lib/Drupal/Core/Extension/ModuleHandler.php).

したがって、現在コンストラクタに何も渡していないので(正確に何を渡せばよいかわからない)、load()メソッドがオブジェクトを参照してこのエラーが発生するため、静的にメソッドを呼び出すことは問題になりません。

Error: Using $this when not in object context in Drupal\Core\Extension\ModuleHandler::load() (line 122 of core/lib/Drupal/Core/Extension/ModuleHandler.php).

それで、この特定のクラスをどのように使用するべきですか?それともmodule_load_include()を使用するだけですか?

Drupal 8のやり方は何ですか?


それで、モジュールBの手続き型コードからモジュールAの手続き型コードを呼び出す必要があり、モジュールAのコードはインクルードにありますか?
mpdonadio

モジュールハンドラーはサービスです。を使用する\Drupal::moduleHandler()か、独自のコンテナ対応クラスに挿入して、完全にインスタンス化されたバージョンを取得します
Clive

\ Drupal :: ModuleHandler();を使用します。構文エラーを投げているようです。
ジャックライアン

1
ただ\Drupal::moduleHandler()->loadInclude($foo, $bar);、(「使用」はコードではなく、最後のコメントのテキストの一部であり、混乱を招く理由を理解できます)
Clive

1
注:まだ存在していますが、8.xで使用する必要がある理由はほとんどありません。モジュールが自動的に読み込まれない別のファイルに(api)関数を持っている場合にのみ必要です。これはもう行うべきではありません。それが8.xのサービスです。8.xの概念に完全に移植されていない、または7.xの概念で記述されていないモジュールのように聞こえます。
Berdir 16

回答:


6

答えは、loadメソッドは正しいメソッドではなく、特定のloadInclude()メソッドがあるということです。

\Drupal::moduleHandler()->loadInclude('ilib_connect', 'module');

2
ModuleHandler::loadInclude静的ではないので、静的に呼び出さないでください。これは、古いPHPのナンセンスの残りであり、PHP5でE_STRICTを生成します。7でさらに悪化する可能性があります。また、Drupal側からは、現在は問題がありますが、実装が変更された場合(たとえばを使用する場合$this)、将来的に問題が発生する可能性があります。サービスインスタンスを現在のコンテキストに取り込むことが、方法です
Clive

1
では、これを削除します。
Jack Ryan

2
それともあなたはそれを編集でき、正しい外のコンテナ方法は次のとおりです。\Drupal::moduleHandler()->loadInclude($foo, $bar);
クライヴ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.