我在某地读过一个不应该传递普通模型对象来查看,而只是只读对象。所以,目前我的控制器中有这样的东西:
$user = new User(); // Model class
$user->loadUserById($id);
$this->setData('user', $user); //obviously $this refers to the controller object
$this->displayView();
然后,我在模板中渲染我想要的字段。这种方法有什么问题,或者将模型对象传递给视图是完全可以接受的吗?
答案 0 :(得分:1)
这有点复杂。
建议提供"只读对象" (他们可能使用了一个单词" immutable")是一个稍微夸张的结论,来自一个关于MVC的更大原则:
观点不应改变模型图层的状态。
更改模型层的状态是控制器的责任。也就是说,控制器不负责将信息传递给MVC中的视图。这就是 ViewModels 适用于MVVM和演示者 - 在MVP中。
我还要注意,你不应该混淆"观点"和"模板"。视图使用模板,但生成响应模型层状态的响应的责任。您可能会发现this很有趣。
答案 1 :(得分:0)
我想避免传递模型对象的原因是,正在处理视图的人可能会想在视图中做一些“业务逻辑”。这将打破“关注点分离”。
如果出现以下情况,您无需担心:
smarty
之类的模板语言来呈现视图。在公认的实践中,这种语言缺乏做商业逻辑的能力。