コントローラへの\ Drupal :: moduleHandler()の依存性注入を使用するにはどうすればよいですか?


14

コントローラークラスで次の行を使用しています。

    \Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);

Pareview.shからこのエラーメッセージが表示されます。

クラスでは\ Drupal呼び出しを避け、代わりに依存性注入を使用してください。

どうすればこれを達成できますか?コンストラクター、メソッド、またはサービスを作成する必要がありますか?その場合、サービスに必要なコードは何ですか?サービスが既に存在する場合の「Drupal呼び出しはクラスでは避け、代わりに依存性注入を使用する」という例を見つけました。


create親メソッドをオーバーロードします-ここで、必要なサービスを注入できます。コンストラクターは、それらをクラスのインスタンス変数に割り当てることができるので、使用できます$this->fooInjectedClass->methodName()
ケビン

これについてすでに質問がありますか?そうでない場合、これを本当に標準化する必要があります。
mpdonadio

回答:


20

コントローラでは、サービスコンテナを使用してサービスを注入します。例ModuleHandler

namespace Drupal\mymodule\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;

class MyController extends ControllerBase {

  /**
   * The module handler service.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * Constructs a MyController object
   *
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   The module handler service.
   */
  public function __construct(ModuleHandlerInterface $module_handler) {
    $this->moduleHandler = $module_handler;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('module_handler')
    );  
  }

その後\Drupal、挿入されたサービスを使用して呼び出しを回避できます。

$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);

任意のサービス、core / contribからの既存のサービス、または*.services.ymlファイルのカスタムコードで定義したサービスを注入できます。

コアサービス名を見つけるには、通常core.services.yml、IDEでdrupalプロジェクトに取り組んでいる最も簡単な方法であるため、を調べます。

Drupalコンソールを使用して、コアからだけでなく、すべてのサービスを一覧表示できます。

drupal debug:container

Develモジュールを使用して、名前を検索することもできます。

/devel/container/service

1
この種の質問/回答は、私が同意したときに展開し、drupal.orgのドキュメントに貢献する必要があります。あるいくつかありますが、私はこのいつも助けのような現実の世界の例を感じます。
ケビン

4
ControllerBaseクラスはすでに実装ContainerInjectionInterfaceインタフェースを。implements ContainerInjectionInterface拡張するクラスに追加する必要はありませんControllerBase
キアムルノ

右、@ kiamlalunoと同じことに気づいただけです。答えを更新するのは壮大です!
ステファノスペトラキス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.