最好让您的 View 以面向对象的方式访问 Domain Model 对象,而不是使用 Controller 将 Model 数据转换为纯标量和数组。
这有助于防止 Controller 长得太胖。请参阅贫血域模型反模式。控制器只需要知道要实例化什么模型,将请求输入传递给该模型,然后将模型注入视图脚本并渲染。请记住,域模型不是数据访问类。
您还可以编写View Helpers来封装域模型对象的通用渲染,因此您可以在多个 View 脚本中重用它。
您的视图应该仅以只读方式访问域模型。视图脚本不应尝试对域模型进行更改。
您还可以根据需要设计域模型以实现ArrayObject或其他 SPL 类型,以便在 View 脚本中轻松使用 OO。
确实,MVC 和 OO 设计的一大驱动动机是解耦。我们希望允许每一层在修改其他层时保持不变。只有通过它们的公共 API,这些层才能进行交互。
ViewModel 是一种抽象模型的解决方案,以便视图不需要更改。我倾向于使用的是Domain Model,它抽象了表设计等细节,并提供了一个更专注于业务而不是数据访问的API。因此,如果您的基础表发生更改,视图不必知道它。
我希望如果域模型发生变化,例如它需要提供一种新类型的属性,那么您的视图很可能会发生变化,以在 UI 中显示该新属性。
您选择哪种技术将一层与其他层解耦取决于您期望最频繁的更改类型,以及这些更改是否将是真正独立的更改,或者它们是否需要对多个层进行更改。