2

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

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

  • 所有与数据库相关的代码,甚至是与数据库相关的逻辑,都应该放在模型中。
  • 对于一个表,比如“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

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

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

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

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

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

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

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

4

1 回答 1

1

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

于 2012-09-04T13:35:07.200 回答