gpt4 book ai didi

php - 模型类应该代表一个实体还是返回它

转载 作者:可可西里 更新时间:2023-10-31 22:42:39 29 4
gpt4 key购买 nike

我正在使用 CodeIgniter 设计网络应用程序(但我认为这个问题通常适用于 Web 应用程序中的 MVC 模式)。

当我为某个数据库实体(例如,BlogEntry)设计模型类时,我基本上有两种选择:

“经典 OOP”方法是让类代表 实体,即类的一个实例 BlogEntry。在 CodeIgniter 中,这将导致类似的代码

class Blogentry extends CI_Model {
function load($id) {
// Access database
$this->id = $dbresult.id;
$this->title = $dbresult.title;
$this->author = $dbresult.author;
}
}

要访问某些博客条目,我会执行 $this->load->model('blogentry');,调用 $this->blogentry->load( $id) 然后使用模型类实例。

我在野外经常看到的另一种方法是让模型返回某种数据结构中的实体。在代码中:

class Blogentry extends CI_Model {
function get_entry($id) {
// Access database, yielding $dbresult
return $dbresult;
}

有了这个我会写

$this->load->model('blogentry');
$the_entry = $this->blogentry->get_entry($id);

在 Controller 中并使用 $the_entry。在第二种情况下,该类更像是一个 factory。或 builder类。

这两种方法中的任何一种都被认为是在 MVC 中执行 M 的“正确方法”吗?我想,我经常看到第二种方法,但我没有看到那么多 MVC-Webapps。关于为什么第一种或第二种方法可能更合适的想法?

最佳答案

首先,CodeIgniter 不是 MVC 框架。最适合的范例可能是 MVP 或类似 ORM-Template-Adapter 的东西。因此,让我根据命名谬误分解我的答案:

在经典/传统 MVC(不是框架声称的 MVC)中,模型不是类或单个文件,而是包含所有领域业务逻辑的,通常仅由 Domain Objects 之类的东西组成, Data Mappers ,以及处理调用实体和域逻辑之间的接口(interface)的东西,以将此类代码保留在 Controller 之外(例如,在 MVC 中)。 Tereško names them "services" ,这足以作为一个准官方名称。

因此在传统的 MVC 中,对模型层的请求通过“服务”传入,而“服务”又与领域对象和数据映射器交互。

显然,所有这些与 CodeIgniter 和其他框架所谓的“MVC”几乎没有关系。在这种设计模式(我简称为“CIMVC”)中,Model是Controller调用和操作的类,直接与数据库交互。在模型中的成员变量中存储数据并没有太多的语义意义,但如果您对类似的东西感兴趣,请查看任何用 CIMVC 编写的 ORM 插件/库。 (尽管 ORM 解决方案在符合传统 MVC 方面不会更好...)

至于常见的做法,我见过的大多数 CI 应用程序都会将“原始”数据库数据返回给 Controller 进行处理;这将域业务逻辑保留在模型中。在 CIMVC 中,我个人的偏好是最小化/消除模型中除域业务逻辑之外的任何内容。

tl;dr - CodeIgniter 中的“传统/正确”MVC 基本上是不可能的,因此试图强制您的 CI 代码符合传统 MVC 范例是愚蠢的(并且可能会让您精神错乱)

编辑:为了澄清之前关于模型层中业务逻辑的一些混淆,是的,您应该在模型层中拥有所有业务逻辑。但是,如果正在进行额外的数据处理(排序、操作等),现在我们将进入违反 DRY 和 SRP 的危险区域;您希望模型可重用,因此请注意不要添加过多或此类专用逻辑,以免它在应用程序的其他部分变得无法使用。

关于php - 模型类应该代表一个实体还是返回它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11832921/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com