\ Drupal :: moduleHandler ()에 대한 의존성 주입을 컨트롤러에 어떻게 사용합니까?


15

컨트롤러 클래스에서 다음 줄을 사용하고 있습니다.

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

Pareview.sh가이 오류 메시지를 표시합니다.

\ Drupal 호출은 클래스에서 피해야합니다. 대신 의존성 주입을 사용하십시오.

어떻게해야합니까? 생성자, 메소드 또는 서비스를 작성해야합니까? 그렇다면 서비스에 어떤 코드가 필요합니까? 서비스가 이미 존재하는 경우 "클래스에서 중복 호출을 피하고 종속성 주입을 사용하십시오"에 대한 예를 찾았습니다 .


create부모 메소드를 오버로드합니다-여기에서 필요한 서비스를 주입 할 수 있습니다. 그러면 생성자는 클래스의 인스턴스 변수에 해당 변수를 할당 할 수 있으므로 다음을 사용할 수 있습니다.$this->fooInjectedClass->methodName()
Kevin

우리는 이미 이것에 대해 질문이 있습니까? 그렇지 않다면, 우리는 이것을 정식으로 만들어야합니다.
mpdonadio

답변:


21

컨트롤러에서 서비스 컨테이너를 사용하여 서비스를 주입합니다. 예를 들면 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.ymlIDE에서 drupal 프로젝트를 작업 할 때 가장 빠른 방법이기 때문에 일반적으로 살펴 보는 핵심 서비스 이름을 찾으려면 .

Drupal Console 을 사용하면 코어뿐만 아니라 모든 서비스를 나열 할 수 있습니다 .

drupal debug:container

이름을 검색 할 수 있는 Devel 모듈을 사용할 수도 있습니다 .

/devel/container/service

1
이런 종류의 질문 / 답변은 동의 할 때 확장되어야하며 drupal.org 문서에 다시 기여해야합니다. 거기에는 몇 가지 가 있지만 나는 이것이 실제로 도움이되는 실제 사례를 느낍니다.
Kevin

4
ControllerBase클래스는 이미 구현 ContainerInjectionInterface인터페이스를. implements ContainerInjectionInterface확장 된 클래스 에 추가 할 필요가 없습니다 ControllerBase.
kiamlaluno

맞습니다. @kiamlaluno와 같은 것을 보았습니다. 답변을 업데이트하기 위해 웅대 한 것입니다!
Stefanos Petrakis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.