繁体   English   中英

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

[英]Are there concrete benefits to injecting Controllers with Data opposed to injecting Controllers with 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恰好代表着模型,视图,控制器,因此注入模型可能被认为是一件“好事”。 如果是这样,我是否试图通过删除对Model的Controller依赖来解决这个问题?

假设我坚持要向控制器而不是模型中注入数据。 您认为这纯粹是一个优先问题吗?

从我的角度来看,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函数,列出所有类别的条件,相关模型的急切或延迟加载等...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM