如何在\ Drupal :: moduleHandler()上对控制器使用依赖项注入?


15

我在控制器类中使用以下行。

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

Pareview.sh给我这个错误消息。

\在类中应避免重复调用,而应使用依赖注入。

我应该如何做到这一点?我需要创建构造函数,创建方法还是服务?如果是这样,服务应该需要什么代码?对于已经存在服务的情况,我找到了一个有关“应避免在类中进行Drupal调用,而应使用依赖注入”的示例。


create将重载父方法-您可以在此处注入所需的服务。然后,构造函数将允许您将这些变量分配给类中的实例变量,以便您可以使用$this->fooInjectedClass->methodName()
Kevin

我们已经对此有疑问吗?如果没有,我们应该真正做到这一点。
mpdonadio

Answers:


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.yml,我会寻找一个核心服务名称,因为这是在IDE中处理drupal项目时最快的方法。

您可以使用Drupal Console列出所有服务,而不仅限于核心:

drupal debug:container

您还可以使用Devel模块,该模块允许您搜索名称:

/devel/container/service

1
经我同意,应扩展此类问题/答案,并将其反馈给drupal.org文档。那里有些东西,但是我觉得像这样的现实世界例子总是有帮助的。
凯文(Kevin)

4
ControllerBase类已经实现了ContainerInjectionInterface接口。无需添加implements ContainerInjectionInterface扩展类ControllerBase
kiamlaluno

是的,只是注意到了与@kiamlaluno相同的事情;将隆重更新答案!
Stefanos Petrakis,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.