【问题标题】:Correct MVC design for Symfony/Propel?Symfony/Propel 的正确 MVC 设计?
【发布时间】:2012-08-31 06:02:34
【问题描述】:

如果只是要求使事情正常工作,我们可以将所有控制登录和数据库处理逻辑甚至放在视图中,它会起作用。然而,这不是可重用设计的正确方法。

在我提出真正的设计问题之前,以下是我目前对模型职责分离的理解。

  • 所有与数据库相关的代码,甚至是与数据库相关的逻辑,都应该放在模型中。
  • 对于一个表,比如“my_tab”,推动生成 4 个类,其中只有 2 个类“MyTab.php”和“MyTabPeer.php”应该被编辑。
  • MyTabPeer.php 只能获取数据。
  • 如果需要获取数据,任何逻辑都应该放在“MyTab.php”中

这很简单,我希望它是正确的,如果不是,请纠正我。

现在,我有一个特殊情况。我有 4 张桌子,比如 a、b、c、d。为此,propel 生成了 8 个可编辑类(不包括 base*.php)

A.php    APeer.php    B.php    BPeer.php
C.php    CPeer.php    D.php    DPeer.php

我的应用程序的一页,显示邮箱(比方说)。 Mailbox 不是数据库中的表,而是从上述 4 个表之间的复杂连接查询以及大量计算/条件中获取数据。

我生成了该查询,从中获取数据并显示它。邮箱按预期运行。但是我在我的控制器(动作类)中做到了,我知道这不是一个合适的地方。

我的问题是,我应该把代码放在哪里?可能的选择:

  • 我认为控制器不适合用于数据库逻辑/获取。
  • 我有 8 个模型分类,但数据不属于其中任何一个,而是它们的组合。
  • 一个单独的帮助程序/lib,但我知道我永远不会将该代码用作网站的唯一页面。
  • 还有其他地方吗?

如果我错了,请提出建议,但我想我应该把它放在模型中,因为它正在获取数据。由于 A 是主表,我可能应该将代码放在 A.php 和 APeer.php 中。如果这是正确的地方,下一个问题是,A.php 中应该包含什么以及 APeer.php 中应该包含什么?我有以下操作要做:

  • 一些逻辑来决定我应该选择哪些列。
  • 就像邮箱一样,我可以显示收到/发送的消息。控制器会告诉要显示什么,但有一些数据库逻辑来设置条件。
  • 然后真正从复杂的 Join 查询中获取数据。
  • 返回的数据将包含所有行,但我可能需要有条件地合并几行。

根据我的理解,第 3 点应该放在 APeer.php 中,然后放在 A.php 中。我的理解正确吗?

【问题讨论】:

  • 如果您正在构建对象图,您必须以一个对象及其所有相关实体结束。你的对象是哪个?邮箱?您能否提供有关您正在获取的数据的更多详细信息?它是电子邮件列表吗?
  • @Keyne 感谢您的回复。周末所以即使我没有确切的表格,但其他问题stackoverflow.com/questions/12198874/… 有我正在使用的查询。希望该查询有助于了解我在做什么。

标签: model-view-controller symfony1 symfony-1.4 propel


【解决方案1】:

您应该创建单独的模型类,即邮箱。 该模型的方法应该执行复杂的选择并将数据返回到控制器中的操作。此解决方案不会破坏 MVC 方法。

【讨论】:

  • 谢谢,听起来很有趣。但正如我之前所说,数据库中没有像邮箱这样的表,所以从 ORM 的角度来看是正确的吗?同样,如果没有 db 表,将不会为此生成任何代码;在那种情况下,我是否应该将所有 4 个类都写成 propel 生成的。能不能详细说一下。再次感谢您的回答。
  • 在 symfony 模型中不必与一张表相关。事实上,它可以与另一个源(例如 LDAP)相关。 Propel 将自动生成表的基类(参见模型目录中的 om 子文件夹)。如果您需要按照您的描述组合来自 4 个表的数据 - 在 lib/model/Mailbox.php 中创建单独的类将是逻辑,您可以从 APeer BPeer 等获取数据。在那里并将结果返回到您需要的操作...
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多