Php “是我吗?”;“做错了”;在科哈纳3号?

Php “是我吗?”;“做错了”;在科哈纳3号?,php,kohana,kohana-3,Php,Kohana,Kohana 3,当我有一个控制器(例如文章)时,我通常有一个action\u view()来处理大部分代码 有时,它可以变成80-100行长 我的控制器通常处理所有这些: 绑定模板变量 设置会话(如适用) 发送电子邮件 验证表单 我可以看到一些细节,我可以在控制器中创建另一个私有方法,不一定是为了重用,而是为了分离关注点 然而,(在我看来)有可以通过路由调用的方法和只在内部调用的方法看起来很奇怪 还有一些事情对我说“我应该在模型中,而不是控制器中”。然而,我也不确定这是否正确 最后,我有一个有点胖的控制器方

当我有一个控制器(例如文章)时,我通常有一个
action\u view()
来处理大部分代码

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

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

  • 绑定模板变量
  • 设置会话(如适用)
  • 发送电子邮件
  • 验证表单
我可以看到一些细节,我可以在控制器中创建另一个私有方法,不一定是为了重用,而是为了分离关注点

然而,(在我看来)有可以通过路由调用的方法和只在内部调用的方法看起来很奇怪

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

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

我是否应该在我的
操作*
方法的顶部有一个列表,然后将其余的代码分成更小的模块

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

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());
        }

    }

因此,我的问题是,我做错了吗?

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

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

至于电子邮件发送,我想这取决于具体情况。例如,当用户注册时,我调用Model方法将其详细信息插入数据库。然后,此方法会触发发送给他们的电子邮件。通过这种方式,我将电子邮件发送作为注册业务逻辑的一个明确部分(在本例中,这就是我想要的),因此无论是谁在模型中调用注册方法,系统都不会忘记发送电子邮件


当涉及到表单验证时,我尝试在ORM模型类中指定我的大多数验证规则。这使得无论是谁操纵模型,模型总是对如何验证自己的数据有一些固有的理解。您会注意到ORM模型对象已经提供了一种验证其数据的方法。模型本身不需要了解保持跟踪的任何额外验证/回调都可以在模型代码之外完成。

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

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

至于电子邮件发送,我想这取决于具体情况。例如,当用户注册时,我调用Model方法将其详细信息插入数据库。然后,此方法会触发发送给他们的电子邮件。通过这种方式,我将电子邮件发送作为注册业务逻辑的一个明确部分(在本例中,这就是我想要的),因此无论是谁在模型中调用注册方法,系统都不会忘记发送电子邮件

当涉及到表单验证时,我尝试在ORM模型类中指定我的大多数验证规则。这使得无论是谁操纵模型,模型总是对如何验证自己的数据有一些固有的理解。您会注意到ORM模型对象已经提供了一种验证其数据的方法。模型本身不需要知道的任何额外的验证/回调都可以在模型代码之外完成。

IANAHPD(我不是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、点击跟踪等相关的内容),主要是因为这些关注点是以表示为中心的,而不是以业务为中心的,第二个原因是,无论出于何种原因,这使得以后很难将系统零碎地移植到另一种语言/平台。

IANAHPD(我不是PHP开发人员),而是一种通用编程语言(Java)的观点