在开发一个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;
}
这是正确的方法吗?也许我在阻止文件中做的太多了?我应该创建一个将逻辑转移到另一个地方的服务吗?可能我需要更多的东西,这意味着要使用更多的服务,并且我的“创建”和“构造函数”方法的参数不断增加。这是正确的方法吗?谢谢。
答案 0 :(得分:0)
当您必须在一个类中注入许多服务(无论是控制器还是块)时,通常会表明该类的设计不好,因为您(可能)仅在一个类中尝试了很多事情。
但是,我已经看到许多控制器在其构造函数中注入了多个服务,因此这似乎并不是一种不寻常的做法。 “每条规则都有例外”。
最后,我认为这是一个平衡问题,构建一个负责做一件逻辑事情的类,并以相同的方式依赖于它。