CodeIgniter,同一模型方法中的多个查询或控制器中多个模型调用?

时间:2012-10-01 22:52:29

标签: php model-view-controller codeigniter model codeigniter-2

我刚刚开始将一些基本应用程序转换为CodeIgniter,并且我试图确保我从正确的位置开始。

我的控制器中的大多数操作都需要至少1个查询,而且我认为有两种方法可以解决这个问题......

  1. 将查询合并到模型中的单个方法中,因此只需从控制器调用一次模型。

  2. 让每个查询在模型中都是自己的方法,然后从控制器依次调用每个方法。

  3. 到目前为止,我已采用自己的政策,但我不确定是否建议或违反MVC模式。

    如果查询彼此直接相关并且只是按顺序一起运行(第二个查询取决于第一次运行成功),则第一个查询中的数据将传递给第二个查询,它是第二个返回实际显示结果集的查询,然后我选择#1

    如果每个查询都返回自己单独的结果集进行显示,那么我选择#2

    在这种情况下,是否有建议的方法来构建和分离逻辑? 我想做的最后一件事就是让自己成为一个噩梦。我的直觉告诉我,尽可能多的逻辑应该在控制器中。

2 个答案:

答案 0 :(得分:1)

您的想法是正确的,如果某些查询只能一起运行,它们应该属于模型中的相同方法。独立查询应该采用自己的方法,这样您就可以在需要时从控制器中调用它们。

要组合多个查询,您可以从控制器进行多次调用,如下所示:

$this->your_model->doQuery1();
$this->your_model->doQuery2();
$this->your_model->doQuery3();

或者(这就是我要做的),在运行这三个查询的模型中创建一个包装器方法。

所以你可以做到

$this->your_model->runQueries();

,其中

function runQueries() {
  $this->doQuery1();
  $this->doQuery2();
  $this->doQuery3(); 
}

这使得以后更改更具有可塑性。

最后,至于你的陈述'尽可能多的逻辑应该在控制器中',这实际上违背了有些人订阅的skinny controller, fat model的学校。与任何其他思想流派一样,它并非一成不变。

答案 1 :(得分:1)

首先:在退出应用程序时使用框架 - 总是一个糟糕的选择。框架不会使您的应用程序更好。他们在那里更快地进行开发。

此外,您必须了解CodeIgniter并未真正实现正确的MVC。相反,它模仿Rails架构和命名约定。它实际上更接近MVP模式。


在任何情况下,控制器必须尽可能轻便

如果实现适当的MVC或MVC启发模式,则所有域业务逻辑都将位于模型层中,并且视图中将包含所有表示逻辑。控制器只会将相关数据传递给模型层和当前视图。

在为CodeIgniter编写代码时,您应该在“模型”中保留尽可能多的域逻辑,并在view helpers中保留大部分表示逻辑。

CodeIgniter中称为“模型”的内容大多是domain objects,有时会与存储逻辑(违反SRP)合并以实现active record模式。

最好的选择是创建更高级别的“模型”,它们将充当services,并将控制器与CodeIgniter的“模型”直接交互分开。

在您描述的情况下,您必须向不同的“模型”发出两个请求,此操作将完成此类服务。服务聚合来自两个“模型”的数据并将其传递给控制器​​。


例如:如果您要注册新用户,则必须执行两项操作 - 为存储中的帐户创建条目(通常是数据库)并将用户通知发送到电子邮件。这两个操作都可以包含在服务中,负责用户管理。

Controller只会要求服务包装新帐户。事实上,服务将执行多个操作(初始化User“模型”,为其分配数据,存储它然后成功,启动Mailer并发送电子邮件)与控制器完全无关。控制器只想知道错误列表(如果列表为空,一切正常)。

.. 我的两分钱