向控制器注入数据与使用模型注入控制器相比,是否有具体的好处?

时间:2015-10-09 21:39:04

标签: php oop model-view-controller dependency-injection inversion-of-control

我提出这个问题的目的是想知道将Controller直接注入所需的数据(更具体的方法)是否有好处,而不是将模型注入控制器(更通用的方法)。或者确定它是否只是一个偏好。

使用模型注入控制器:

模型可用于运行各种查询以检索各种数据位,但它是比数据本身更重的构造。模型本质上包含数据,或者至少它可以访问您可能需要的所有数据。例如:

class CategoryControllerWithModel
{
    private $model;

    public function __construct($model)
    {
        $this->model = $model;
    }

    // generates HTML for input form
    public function genHtml()
    {
        /* retrieve data */
        $categories = $this->model->getCategories();

        //...
    }
}

//instantiation within Factory Method:
class Factory
{
    $model = new CategoryModel();
    $controller = new CategoryControllerWithModel($model);
    return $controller;
}

使用数据注入控制器:

这里我们在Factory方法中做了更多的事情,但是我们得到了一个更精简的控制器,它只接收它所需的数据,并且完全与模型分离,甚至不知道它的存在。

class CategoryControllerWithData
{
    private $categories;

    public function __construct($categories)
    {
        $this->categories = $categories;
    }

    public function genHtml()
    {
        $categories = $this->categories;
    }
}

//instantiation within Factory Method:
class Factory
{
    $model = new CategoryModel();

    //a bit more work to get the data Controller needs
    //benefit:  Controller not tied to the Model
    $categories = $model->getCategories():

    $controller = new CategoryControllerWithData($categories);
    return $controller;
}

问题:

我认为MVC正好代表 - 模型,视图,控制器,所以注入模型可能被认为是一个“好”的事情。如果是这样,我是否通过尝试删除Controller对模型的依赖来实现这一点?

假设我坚持要将数据注入控制器而不是模型。这是一个纯粹的优惠问题,你认为这样做有什么好处吗?

2 个答案:

答案 0 :(得分:1)

从我的角度来看,Factory不应该对域逻辑负责。它应该只负责建立。

在这种情况下,在您注入数据的地方,Factory必须知道控制器正在搜索哪些类别,是否有任何过滤等等。

所以我认为对于控制器你应该只注入模型,只保留工厂单一的责任来构建东西,控制器应该负责它的数据。

答案 1 :(得分:0)

我认为这是“关注点分离”的问题,我认为这不是使用MVC的好例子。我会更多地考虑这些方面:

class FooController
{
    public function actionView($alias){
        $category = Category::loadByAlias($alias);
        ..... load and render layouts etc .....
    }

    public function actionList(){
        $categories = Category::loadAll();
        ..... etc ......
    }
}

像这样,控制器和工厂都不需要知道在加载类别时需要做什么,也不需要处理活动/非活动状态,甚至是用户访问...等等这都是模型逻辑,模型可以有beforeLoad和afterLoad函数,列出所有类别的条件,相关模型的急切或延迟加载等......