我在分解一个复杂的控制器时遇到了问题。
这个动作有很多不同的条件,每个块中的代码使用不同的依赖项。将其分解为单独的控制器,以便更好地处理不断增长的构造函数依赖项列表,最合理的方法是什么?
之所以将所有内容都放在一个操作中,是因为它提供了一个URL /report
,该URL基于权限和其他条件呈现不同的模板。
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();
}
}
}
4条答案
按热度按时间lx0bsm1f1#
您必须创建一个服务(在控制器中调用)来定义所有业务逻辑。控制器应该只截获请求以呈现响应。
编辑:请查看官方文档,特别是
Service Container
部分:http://symfony.com/doc/current/book/service_container.htmlyvt65v4c2#
您可以使用的是Chain。
你需要有人负责处理依赖关系。如果你使用Symfony DI容器(我知道你这样做),你可以很容易地通过服务定义中的标签将依赖关系添加到链中。
查看此处http://symfony.com/doc/current/components/dependency_injection/tags.html
如果没用的话你可以去杀了我IRL
9rygscc13#
我不知道有哪种方法是最好的。以下是一些建议:
1.恢复使用依赖注入容器作为服务定位器,并根据需要从其中提取依赖项。我是将控制器定义为服务并注入依赖项的大力支持者,但有时使用服务定位器最有意义。
1.创建一个kernel.controller监听器http://symfony.com/doc/current/cookbook/event_dispatcher/event_listener.html,并使用它根据用户角色或其他任何条件来选择容器。这是一个有很好文档记录的方法,尽管它确实隐藏了监听器中的一些依赖信息。
1.扩展ControllerResolver http://api.symfony.com/2.0/Symfony/Component/HttpKernel/Controller/ControllerResolver.html并根据角色或其他条件选择控制器。基本上与使用侦听器的方法相同,但工作方式稍有不同。这可能是最简洁的方法,尽管示例不多。Extending Symfony2 Controller Resolver
fhity93d4#
另一种可能性是通过扩展其他控制器在本例中您创建了其他控制器,例如ToolsController.php
在你的控制器里,