web-dev-qa-db-ja.com

コントローラへの\ Drupal :: moduleHandler()への依存性注入をどのように使用しますか?

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

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

Pareview.shがこのエラーメッセージを表示しています。

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

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

15
Kevin Nowaczyk

コントローラでは、サービスコンテナを使用してサービスを注入します。たとえば、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);

コア/コントリビュートからの既存のサービスや、*.services.ymlファイルのカスタムコードで定義したサービスを挿入できます。

コアサービス名を見つけるために、私は通常core.services.ymlを調べます。これは、IDEでdrupalプロジェクトに取り組んでいるときに最も速い方法だからです。

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

drupal debug:container

Devel module を使用して、名前を検索することもできます。

/devel/container/service
21
4k4