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
モジュールハンドラーはサービスです。を使用する
—
Clive
\Drupal::moduleHandler()か、独自のコンテナ対応クラスに挿入して、完全にインスタンス化されたバージョンを取得します
\ Drupal :: ModuleHandler();を使用します。構文エラーを投げているようです。
—
ジャックライアン
ただ
—
Clive
\Drupal::moduleHandler()->loadInclude($foo, $bar);、(「使用」はコードではなく、最後のコメントのテキストの一部であり、混乱を招く理由を理解できます)
注:まだ存在していますが、8.xで使用する必要がある理由はほとんどありません。モジュールが自動的に読み込まれない別のファイルに(api)関数を持っている場合にのみ必要です。これはもう行うべきではありません。それが8.xのサービスです。8.xの概念に完全に移植されていない、または7.xの概念で記述されていないモジュールのように聞こえます。
—
Berdir 16