D8-我需要在块上使用许多服务,此代码正确吗?

时间:2018-11-20 21:36:28

标签: drupal-8

在开发一个Drupal 8示例站点时,我已经在模块中声明了block,并且我想对此模块做一些事情,例如检查路由并仅在节点上显示此block,还要检查用户是否具有以下权限:看到此块,该块的内容就是我在模块的另一个位置定义的形式。

我不想以静态方式获取所需的类/服务,我想使用依赖注入来获取那些类,因为从技术上讲,分离代码并允许进行更好的测试会更好。

现在,块上的“ 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;
  }

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

1 个答案:

答案 0 :(得分:0)

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

但是,我已经看到许多控制器在其构造函数中注入了多个服务,因此这似乎并不是一种不寻常的做法。 “每条规则都有例外”。

最后,我认为这是一个平衡问题,构建一个负责做一件逻辑事情的类,并以相同的方式依赖于它。