[英]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.