拆分Symfony控制器

时间:2015-10-21 14:11:45

标签: php symfony controller dependencies

我遇到了破坏复杂控制器的问题。

该操作有许多不同的条件,每个块中的代码使用不同的依赖项。什么是最合理的方法将其分解为单独的控制器,以便我能够更好地处理我不断增长的构造函数依赖项列表?

一举一动的原因是因为它提供了一个网址/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();
        }

    }

}

3 个答案:

答案 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)

我不知道一个最好的方法。一些建议:

  1. 恢复使用依赖注入容器作为服务定位器,并根据需要从中拉出依赖项。我非常支持将控制器定义为服务和注入依赖关系,但有时使用服务定位器最有意义。

  2. 创建一个kernel.controller侦听器http://symfony.com/doc/current/cookbook/event_dispatcher/event_listener.html并使用它来根据用户角色或您可能拥有的其他条件选择容器。这是一个记录良好的方法,但它确实隐藏了侦听器中的一些依赖信息。

  3. 扩展ControllerResolver http://api.symfony.com/2.0/Symfony/Component/HttpKernel/Controller/ControllerResolver.html并根据角色或其他条件选择控制器。基本上与使用侦听器相同,但在上游工作。这可能是最干净的方法,尽管没有很多例子。 Extending Symfony2 Controller Resolver