我刚刚开始将一些基本应用程序转换为 CodeIgniter,并且我正在努力确保我以正确的基础开始。
我的控制器中的大多数操作都需要至少 1 个查询,据我所知,有 2 种方法可以实现此目的:
将查询合并到模型中的单个方法中,因此只需从控制器对模型进行一次调用。
让每个查询在模型中都有自己的方法,然后从控制器依次调用每个方法。
到目前为止,我已经采用了自己的策略,但我不确定它是否建议或打破了 MVC 模式。
如果查询彼此直接相关并且仅按顺序一起运行(第二个查询取决于第一个查询是否成功运行),则或来自第一个查询的数据将传递到第二个查询,并且这是第二个查询返回实际显示结果集,那么我就用#1
如果每个查询都返回其自己的单独结果集以供显示,那么我会选择 #2。
在这种情况下,是否有推荐的方法来构建和分离逻辑?
我最不想做的事就是让自己以后陷入噩梦。我的直觉告诉我,尽可能多的逻辑应该位于控制器中。
您的想法是正确的,因为如果一组特定的查询只会一起运行,那么它们应该属于模型中的相同方法。独立查询应该有自己的方法,这样您就可以在需要时从控制器调用它们。
要组合多个查询,您可以从控制器进行多个调用,如下所示:
$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
的思想流派。与任何其他思想流派一样,它并不是一成不变的。
首先:在退出应用程序时使用框架 - 总是一个糟糕的选择。框架不会让你的应用程序变得更好。他们的存在是为了让开发更快。
此外,您必须了解 CodeIgniter 并没有真正实现正确的 MVC。相反,它模仿 Rails 架构和命名约定。它实际上更接近 MVP 模式。
无论如何,控制器必须尽可能轻。
如果实现正确的 MVC 或受 MVC 启发的模式,所有领域业务逻辑都将位于模型层中,所有表示逻辑将位于视图中。控制器只会将相关数据传递到模型层和当前视图。
为 CodeIgniter 编写代码时,应在“模型”中保留尽可能多的领域逻辑,并在 view helpers 中保留大部分表示逻辑。
CodeIgniter 中所谓的“模型”大多是域对象,有时会与存储逻辑合并(违反SRP)以实现活动记录模式。
对您来说最好的选择是创建更高级别“模型”,它将充当服务并将控制器与CodeIgniter的“模型”直接交互分开。
在您所描述的情况下,您必须向不同的“模型”发出两个请求,该操作将由此类服务完成。并且该服务聚合来自两个“模型”的数据并将其传递给控制器。
例如:如果您要注册新用户,则必须执行两个操作 - 在存储(通常是数据库)中为帐户创建一个条目并将用户通知发送到电子邮件。这两个操作都可以包含在负责用户管理的服务中。
控制器只会要求服务创建新帐户。事实上,服务将执行多个操作(初始化
User
“模型”,为其分配数据,存储它,然后在成功时启动Mailer
并发送电子邮件)与控制器完全无关。控制器只想知道错误列表(如果列表为空,则一切正常)。
..我的两分钱.