1

I'm just starting to convert some basic applications to CodeIgniter and I'm trying to make sure that I start off on the right footing.

Most actions in my controller require at least 1 query and as I see it there are 2 ways to go about this...

  1. Combine the queries into a single method in the model, therefore making only a single call to the model from the controller.

  2. Have each query be its own method in the model, then call each method in turn from the controller.

So far I've adopted my own policy but I'm not sure if it's advised or breaking the MVC pattern.

If the queries are directly related to one another and only ever run together in sequence (the 2nd query is dependent on the 1st running successful), or data from the 1st query is passed to a 2nd query and it's the 2nd query that returns the actual display result set, then I go with #1

If each of the queries is returning its own individual result set for display, then I go with #2

Is there a recommended way to structure and separate the logic in this scenario?
The last thing I want to do is cause myself a nightmare later down the line. My gut instinct is telling me that as much of the logic should be in the controller as possible.

4

2 回答 2

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某些人所认同的学派。与任何其他学派一样,它并非一成不变。

于 2012-10-01T23:08:56.967 回答
1

首先:在退出应用程序的框架上拍打 - 总是一个糟糕的选择。框架不会让你的应用程序更好。他们的存在是为了加快开发速度。

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


无论如何,控制器必须尽可能轻

如果实现正确的 MVC 或受 MVC 启发的模式,所有领域业务逻辑都将在模型层中,所有表示逻辑都在视图中。控制器只会将相关数据传递给模型层和当前视图。

为 CodeIgniter 编写代码时,应在“模型”中保留尽可能多的领域逻辑,并在视图助手中保留大部分表示逻辑。

CodeIgniter 中所谓的“模型”主要是领域对象,它们有时会与存储逻辑(违反SRP)合并以实现活动记录模式。

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

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


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

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

..我的两分钱

于 2012-10-02T01:19:18.803 回答