与向控制器注入模型相比,向控制器注入数据有什么具体的好处吗?


Are there concrete benefits to injecting Controllers with Data opposed to injecting Controllers with Model?

我问这个问题的目的是找出直接向控制器注入它所需的数据(更具体的方法)是否比向控制器注入模型(更通用的方法)有好处。或者确定是否为只是偏好问题

给控制器注入模型:

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

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代表的正是模型,视图,控制器,所以注入模型可能被认为是一个"好"的事情要做。如果是这样,我是否通过试图删除控制器对模型的依赖而走得太远?

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

在我看来,Factory不应该负责域逻辑。它应该只负责建立东西。

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

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

我认为这是一个"关注点分离"的问题,我也不认为这将是使用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函数,列出所有类别的条件,相关模型的渴望或延迟加载等…