将控制器类注入控制器类是不是很糟糕?

时间:2014-10-10 13:12:40

标签: php laravel laravel-4 dependency-injection single-responsibility-principle

通过尝试遵循单一责任原则,我决定渲染表单视图,我可以移动到另一个类。另外,为了呈现表单,我已经计划使用5个依赖项。因此,注入表单的主控制器将具有较少的依赖性,这是好的。

我从未将控制器类注入控制器类。我通常做的是创建库。我有一个库文件夹作为控制器文件夹的兄弟。

但现在想 - 也许更好的想法是将另一个控制器注入控制器?

试图搜索这个,但没有找到任何例子。但同时尝试使用构造函数创建控制器并回显字符串。然后将此控制器注入另一个。并显示字符串。

所以这意味着可以将控制器注入控制器。这样好吗?或者这可能是必须的?

默认情况下,laravel甚至没有有趣的库文件夹,也许创作者认为不需要它。

1 个答案:

答案 0 :(得分:2)

是的,这很糟糕。控制器不仅必须承担一个单一的责任,而且它们也是一个应该只有一个作业的不同类:控制器是HTTP请求和应用程序之间的代理(模型,存储库,视图)。所以基本上它应该接收HTTP请求,从模型中获取一些数据并将其传递给视图。

其他所有内容都应由您的支持类(模型,存储库,帮助程序,作曲家等)完成。

如果您需要调用第二个控制器类,可能是因为您需要该控制器上不应该位于该控制器中的方法,因为您的控制器所做的工作比他们的工作更多。

这是我的控制员之一:

class Connect extends BaseController {

    public function index()
    {
        $connections = $this->execute(GetConnectionsCommand::class);

        return View::make('connections.index')->with('connections', $connections);
    }

}

GetConnectionsCommand幕后发生了很多事情,以获取显示所有连接的信息,我的控制器不应该知道所有这些。

在'connection.index'视图中有一些子视图,但调用子视图是一个视图责任,我的控制器不必知道特定视图需要渲染子视图。我可以在其中设置master视图和一些@if来正确渲染它们。

控制器将数据(渲染视图,由另一个类渲染)返回到响应对象(Laravel中的场景后面),负责有效渲染将传递回浏览器的数据。因此,控制器正处于某种状态,正在进行非常少的orquestration ,因为,它对业务逻辑的了解越多,您就越需要“转移”到另一个控制器。如果你愿意,你可以把它想象成MVP,但这是使用单一责任原则的纯粹MVP。但是在这种情况下,Controller没有与视图分离,因为它们之间没有接口,所以它不是真正的MVP。