我问这个问题的目的是找出直接向控制器注入它所需的数据(更具体的方法)是否比向控制器注入模型(更通用的方法)有好处。或者确定是否为只是偏好问题。
给控制器注入模型:
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函数,列出所有类别的条件,相关模型的渴望或延迟加载等…