【问题标题】:Are there concrete benefits to injecting Controllers with Data opposed to injecting Controllers with Model?用数据注入控制器与用模型注入控制器有什么具体的好处吗?
【发布时间】:2016-01-07 22:46:15
【问题描述】:

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

用模型注入控制器:

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

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 方法中做了更多的前期工作,但我们得到了一个更精简的 Controller,它只接收它需要的数据,并且与 Model 完全分离,甚至不知道它的存在。

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 对 Model 的依赖而走得太远了?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        • 2013-01-25
        • 2013-12-29
        • 2019-10-17
        • 1970-01-01
        • 2013-12-05
        相关资源
        最近更新 更多