我遇到了破坏复杂控制器的问题。
该操作有许多不同的条件,每个块中的代码使用不同的依赖项。什么是最合理的方法将其分解为单独的控制器,以便我能够更好地处理我不断增长的构造函数依赖项列表?
一举一动的原因是因为它提供了一个网址/report
,根据权限和其他条件呈现不同的模板。
PS。代码在技术上并不正确,很快就可以看到我的问题了。
<?php
class ExampleController
{
protected $dependency1;
protected $dependency2;
protected $dependency3;
protected $user;
/**
* ExampleController constructor.
*
* @param $dependency1
* @param $dependency2
* @param $dependency3
* @param $user
*/
public function __construct($dependency1, $dependency2, $dependency3, $user)
{
$this->dependency1 = $dependency1;
$this->dependency2 = $dependency2;
$this->dependency3 = $dependency3;
$this->user = $user;
}
public function exampleAction()
{
if ($this->user->hasRole('a')) {
$this->dependency1->something();
} elseif ($this->user->hasRole('b')) {
$this->dependency2->something();
} elseif ($this->user->hasRole('c')) {
$this->dependency3->something();
}
}
}
答案 0 :(得分:2)
您必须创建一个服务(在控制器中调用)来定义所有业务逻辑。 控制器应该只截取请求以呈现响应。
编辑:
请查看官方文档,尤其是Service Container
部分:http://symfony.com/doc/current/book/service_container.html
答案 1 :(得分:2)
你可以使用的是Chain。
您需要有人负责处理依赖项。如果您正在使用Symfony DI容器(我知道您这样做),您可以在服务定义中轻松地将依赖项添加到Chain via标签中。
在这里查看http://symfony.com/doc/current/components/dependency_injection/tags.html
如果没有帮助你就可以杀了我IRL
答案 2 :(得分:1)
我不知道一个最好的方法。一些建议:
恢复使用依赖注入容器作为服务定位器,并根据需要从中拉出依赖项。我非常支持将控制器定义为服务和注入依赖关系,但有时使用服务定位器最有意义。
创建一个kernel.controller侦听器http://symfony.com/doc/current/cookbook/event_dispatcher/event_listener.html并使用它来根据用户角色或您可能拥有的其他条件选择容器。这是一个记录良好的方法,但它确实隐藏了侦听器中的一些依赖信息。
扩展ControllerResolver http://api.symfony.com/2.0/Symfony/Component/HttpKernel/Controller/ControllerResolver.html并根据角色或其他条件选择控制器。基本上与使用侦听器相同,但在上游工作。这可能是最干净的方法,尽管没有很多例子。 Extending Symfony2 Controller Resolver