0

当我有一个控制器时,例如我经常有一个action_view()处理大部分代码的文章。

有时,它可以变成 80-100 行长。

我的控制器通常处理所有这些:

  • 绑定模板变量
  • 设置会话(在适当的情况下)
  • 发送电子邮件
  • 验证表格

我可以看到我可以在控制器中创建另一个私有方法的点点滴滴,不一定是为了重用,而是为了分离关注点。

但是,(对我来说)具有可以通过路由调用的方法和仅限内部的方法看起来很奇怪。

还有一些事情对我说“我应该在模型中,而不是控制器中”。但是,我也不确定这是否正确。

最后,我有一个看起来很程序化的有点胖的控制器方法。

我真的应该在我的action_*方法顶部列出一个列表,然后将其余代码分成更小的模块吗?

我在下面有一个例子......这是典型的控制器东西,还是会话等应该在模型中?

public function action_pdf($type, $id) {

        // Get PDF file from db and send headers to it
        $id = (int) $id;

        $pdfFile = $this->model->getPdf($id, $type);

        if ($pdfFile) {
           $this->request->redirect($pdfFile);
        } else {
           $this->session->set('pdfMissing', true);
           $this->request->redirect(Route::get('properties')->uri());
        }

    }

所以,我的问题是,我做错了吗?

4

2 回答 2

3

您的模型用于封装业务逻辑,并且通常将数据存储层从架构的其余部分(控制器、视图)中抽象出来。

这意味着任何数据库访问(例如 SQL 查询)等理想情况下都应该包含在您的模型中。您的控制器将从您的模型中获取其数据(这包括 ORM,它通过模型公开自己),而无需直接访问数据库。

至于电子邮件发送,我想这取决于情况。例如,当用户注册时,我调用 Model 方法将他们的详细信息插入数据库。然后,此方法会触发一封电子邮件发送给他们。这样我就可以让电子邮件发送注册业务逻辑的显式部分(这就是我在这种情况下想要的)所以无论谁调用模型中的注册方法,系统都不会忘记发送电子邮件。

在表单验证方面,我尝试在 ORM 模型类中指定我的大部分验证规则。这样一来,无论谁操作模型,模型总是对如何验证自己的数据有一些内在的理解。您会注意到 ORM 模型对象已经提供了一种验证其数据的方法。模型本身不需要知道的关于保持跟踪的任何额外验证/回调都可以在模型代码之外完成。

于 2010-03-04T07:30:03.360 回答
1

IANAPHPD(我不是 PHP 开发人员),但从通用编程语言 (Java/C#) 开发人员的角度来看可能会有所帮助。对我来说,MVC 的好处之一是在您拥有需要呈现多个 UI 的核心业务逻辑和基础架构时促进代码重用。例如,具有 Web 界面和桌面界面的订单管理系统。在这种情况下,核心逻辑就是模型。这三个接口中的每一个都有自己的视图和控制器。在 C# 中,构建代码非常简单,使得核心逻辑位于一组包/程序集中,这些包/程序集从桌面 UI 项目和 Web 应用程序项目中引用。

即使我很确定某个特定的应用程序不需要另一个 UI,我也认为在这些方面。当我试图决定是否应该在模型或控制器中加入某些东西时,我会问自己该功能是否应该可以从另一个 UI 重用

这是对 PHP 代码的一种不自然的思考方式,因为 PHP 与 Web 平台紧密相连(据我所知)。无论如何,这种思维方式仍然成立(关注点分离和不要重复自己)仍然可以应用:PHP 可以支持的辅助“UI”将是 Web 服务 API。如果一个特性应该对网站和 Web 服务 API 都可用,那么它应该在模型中公开。

您可能感兴趣,也可能不感兴趣,但总的来说,这种思维方式与领域驱动设计完美结合。

注意:尽管 PHP 支持的所有 UI 都是基于 Web 的,但我仍然对将 Web 特定的关注点放入模型(与浏览器会话、cookie、命中跟踪等相关的任何内容)持谨慎态度,主要是因为这些关注点是呈现以业务为中心,而不是以业务为中心,其次是因为这使得以后无论出于何种原因将系统零碎地移植到另一种语言/平台变得更加困难。

于 2010-03-04T07:45:28.227 回答