Zend Framework / MVC:将啥类型的对象推送到视图?

Posted

技术标签:

【中文标题】Zend Framework / MVC:将啥类型的对象推送到视图?【英文标题】:Zend Framework / MVC: What type of objects to push to the View?Zend Framework / MVC:将什么类型的对象推送到视图? 【发布时间】:2009-11-11 09:26:21 【问题描述】:

大家好,这里有一个关于 Zend Framework 或 MVC 更好的问题:

我现在问自己安静了很长时间,将业务对象(用户、团队等)推送到我的视图是否是一个好主意,或者是否最好只推送转储数据容器,例如数组到视图进行渲染。

当将业务对象推送到我的视图时,视图和我的域模型之间的耦合要紧密得多,但是,视图可以轻松地执行诸如 foreach($this->team->getUsers() as $user) 之类的事情... 我个人觉得非常方便。

在我看来,以哑数组提供域模型数据看起来更健壮和灵活,但代价是视图无法对真实对象进行操作,因此无法使用对象的方法访问相关数据。

你们是怎么处理的?

非常感谢, 迈克尔

【问题讨论】:

【参考方案1】:

最好让你的 View 以面向对象的方式访问 Domain Model 对象,而不是使用 Controller 将 Model 数据转换为纯标量和数组。

这有助于防止 Controller 长得太胖。请参阅Anemic Domain Model 反模式。 Controller 只需要知道要实例化什么 Model,将请求输入传递​​给那个 Model,然后将 Model 注入到 View 脚本中并渲染。请记住a Domain Model is not a data-access class。

您还可以编写View Helpers 来封装域模型对象的通用渲染,这样您就可以在多个视图脚本中重复使用它。

您的视图应该仅以只读方式访问域模型。视图脚本不应尝试对域模型进行更改。

您还可以根据需要设计您的域模型以实现 ArrayObject 或其他 SPL 类型,以便在 View 脚本中轻松使用 OO。


的确,MVC 和 OO 设计的一大驱动动机是解耦。我们希望允许每一层在修改其他层时保持不变。只有通过它们的公共 API,这些层才能进行交互。

ViewModel 是一种抽象模型的解决方案,因此视图不需要更改。我倾向于使用的是Domain Model,它抽象了表设计等细节,并提供了一个更专注于业务而不是数据访问的API。因此,如果您的基础表发生更改,视图不必知道它。

我希望如果域模型发生变化,例如它需要提供一种新的属性类型,那么您的视图很可能会发生变化,以便在 UI 中显示新的属性。

您选择哪种技术将一层与其他层解耦取决于您期望最频繁的更改类型,以及这些更改是否将是真正独立的更改,或者它们是否需要对多个层进行更改。

【讨论】:

+1。只要您的域对象不与数据库交互或以任何方式保存数据,我发现能够在我的视图中执行业务逻辑很有价值。例如$team->canAccept($user) 决定是否渲染“加入”按钮。 嘿比尔 - 感谢您的反馈。我同意你的看法。我唯一担心的是域模型是否发生变化。事实上,这意味着我必须更改所有层中的代码,包括。观点。也许这就是现状,一般是无法避免的。我不确定。我想到的另一种选择是在 Controller 和 View 之间放置另一个(薄)层,一个 ViewModel(也参见 Pino 的帖子),它以结构化、面向对象的方式保存所有视图数据,而不仅仅是将“字典”作为值存储ZF 默认提供的。但是,我不确定这是否真的值得。【参考方案2】:

“标准”方法是在控制器中完全准备模型(例如,获取所有团队,包括用户),然后将其发送到视图进行演示,但您不受此约束。数据结构可以是任何你想要的:数组、ArrayObject 或自定义类——你认为合适的任何东西。

【讨论】:

【参考方案3】:

我不使用 Zend 框架,所以这是对一般 MVC 的响应。看看 ViewModel 模式。

http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx

我从 .Net MVC 的角度出发,但我相信这些概念是相同的。

【讨论】:

在这里我认为来自 ASP.NET 背景意味着你会建议 OP 应该转移到存储过程。 :-) 非常感谢!我也认为单独的 ViewModel 可能有意义。然而,我害怕做所有这些额外的工作来实现额外的“视图类型”来抽象真正的业务模型只是为了视图。在某种程度上,这对我来说就像是双重工作。我不确定这是否值得做。你怎么看?【参考方案4】:

我将在控制器中完成所有视图渲染,基本上如下所示

    模型只输出数据集/对象(这应该包含最多的代码) 控制器分配视图并添加必要的 html 并使用模型 view 仅包含占位符和其他演示内容,可能还有 ajax 调用

所以我的团队可以在不中断彼此的情况下处理每个部分,这也为项目增加了一些信息安全性,即没有人可以检索他们仅通过变量/对象规范进行通信的所有工作代码。

【讨论】:

以上是关于Zend Framework / MVC:将啥类型的对象推送到视图?的主要内容,如果未能解决你的问题,请参考以下文章

原创Zend Framework 2框架之MVC

原创Zend Framework 2框架之MVC

Ubuntu18.04下基于apache2部署Zend Framework 3 MVC框架含BUG/问题解决)

通用页面的 Zend Framework 路由?

使用zend-framework3和gettext处理textDomains

如何在Zend Framework 2中访问路由,发布,获取等参数