首页 > 解决方案 > D8 - 我需要在我的街区使用许多服务,这段代码对吗?

问题描述

开发一个 Drupal 8 示例站点,我在一个模块中声明了块,我想用这个块做一些事情,比如检查路线并只在节点上显示这个块,还要检查用户是否有权查看这个块, 块的内容是我在模块的另一个地方定义的表格。

我不想以静态方式获取我需要的类/服务,我想使用依赖注入来获取这些类,因为从技术上讲,解耦代码并允许更好的测试更好。

现在块上的“create”方法和“constructor”方法是这样的:

<?php    
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('current_user'),
      $container->get('form_builder'),
      $container->get('current_route_match'),
      $container->get('access_check.permission')
    );
}


  public function __construct(
    array $configuration, $plugin_id,
    $plugin_definition,
    AccountProxyInterface $user,
    FormBuilderInterface $formBuilder,
    ResettableStackedRouteMatchInterface $route,
    AccessInterface $access
    ) {

     parent::__construct($configuration, $plugin_id, $plugin_definition);
     $this->user = $user;
     $this->formBuilder = $formBuilder;
     $this->route = $route;
     $this->access = $access;
  }

这是正确的方法吗?也许我在块文件中做的太多了?我应该创建一个服务来将逻辑移动到另一个地方吗?可能我需要更多的东西,这意味着使用更多的服务,而且我的“创建”和“构造函数”方法的参数越来越多。这是正确的方法吗?谢谢。

标签: drupal-8

解决方案


当您必须在一个类中注入许多服务时,无论是控制器还是块,它通常表明该类设计得不好,因为您(可能)在一个类中尝试了很多事情。

但是,我见过许多控制器在其构造函数中注入多个服务,因此无论如何这似乎并不是什么不寻常的做法。“每条规则都有例外”。

最后,我认为这是一个平衡的问题,构建一个负责做一件逻辑事情的类,它的依赖关系也是如此。


推荐阅读