拆分Symfony控制器

fcg9iug3  于 2022-11-16  发布在  其他
关注(0)|答案(4)|浏览(162)

我在分解一个复杂的控制器时遇到了问题。
这个动作有很多不同的条件,每个块中的代码使用不同的依赖项。将其分解为单独的控制器,以便更好地处理不断增长的构造函数依赖项列表,最合理的方法是什么?
之所以将所有内容都放在一个操作中,是因为它提供了一个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();
        }

    }

}
lx0bsm1f

lx0bsm1f1#

您必须创建一个服务(在控制器中调用)来定义所有业务逻辑。控制器应该只截获请求以呈现响应。
编辑:请查看官方文档,特别是Service Container部分:http://symfony.com/doc/current/book/service_container.html

yvt65v4c

yvt65v4c2#

您可以使用的是Chain。
你需要有人负责处理依赖关系。如果你使用Symfony DI容器(我知道你这样做),你可以很容易地通过服务定义中的标签将依赖关系添加到链中。
查看此处http://symfony.com/doc/current/components/dependency_injection/tags.html
如果没用的话你可以去杀了我IRL

9rygscc1

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

fhity93d

fhity93d4#

另一种可能性是通过扩展其他控制器在本例中您创建了其他控制器,例如ToolsController.php

Class ToolsController
 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();
        }

    }

在你的控制器里,

use App\Controller\ToolsController;

Class ExampleController extends ToolsController
{
...
}

相关问题