MVC架构:从控制器传递给视图的数据是否应该是只读对象?

时间:2016-08-19 15:04:06

标签: php model-view-controller

我在某地读过一个不应该传递普通模型对象来查看,而只是只读对象。所以,目前我的控制器中有这样的东西:

$user = new User(); // Model class
$user->loadUserById($id);
$this->setData('user', $user); //obviously $this refers to the controller object
$this->displayView();

然后,我在模板中渲染我想要的字段。这种方法有什么问题,或者将模型对象传递给视图是完全可以接受的吗?

2 个答案:

答案 0 :(得分:1)

这有点复杂。

建议提供"只读对象" (他们可能使用了一个单词" immutable")是一个稍微夸张的结论,来自一个关于MVC的更大原则:

  

观点不应改变模型图层的状态。

更改模型层的状态是控制器的责任。也就是说,控制器不负责将信息传递给MVC中的视图。这就是 ViewModels 适用于MVVM和演示者 - 在MVP中。

我还要注意,你不应该混淆"观点"和"模板"。视图使用模板,但生成响应模型层状态的响应的责任。您可能会发现this很有趣。

答案 1 :(得分:0)

我想避免传递模型对象的原因是,正在处理视图的人可能会想在视图中做一些“业务逻辑”。这将打破“关注点分离”。

如果出现以下情况,您无需担心:

  • 你一个人工作。
  • 你是一个由纪律严明的开发人员组成的小团队,有充分的沟通。
  • 您使用smarty之类的模板语言来呈现视图。在公认的实践中,这种语言缺乏做商业逻辑的能力。