我提出这个问题的目的是想知道将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对模型的依赖来实现这一点?
假设我坚持要将数据注入控制器而不是模型。这是一个纯粹的优惠问题,你认为这样做有什么好处吗?
答案 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函数,列出所有类别的条件,相关模型的急切或延迟加载等......