- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 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/
我正在尝试在我的 UITableView 上调用 reloadData。我在没有界面生成器的情况下制作我的应用程序。 此代码适用于 Interface Builder,但似乎没有。 当我将我的代码与我
有人可以解释 UIAlertView 的委托(delegate)是如何工作的吗?它是自动调用还是我必须调用它?例如: - (void)alertView:(UIAlertView *)alertVie
编辑:好吧,根据其他人的建议,我创建了一个最小的示例......并且它有效,因此我将在未来与任何人分享它。这是工作代码: #include #include using namespace std
unicode 是 ,它被用在 XML 文档中。 最佳答案 查看图表:unicodelookup.com 换行符。 关于html - unicode字符是什么 代表?,我们在Stack Overflo
我有一个应用程序,可以以编程方式在配置的 Facebook 页面上发帖。我的应用程序显然已批准管理页面和发布页面权限,并且我正在使用页面访问 token 从现在开始一切正常,但最近当我在页面提要上发布
代表 NCAA 男子篮球分组的最佳数据库模式是什么?如果您不熟悉,请点击以下链接:http://www.cbssports.com/collegebasketball/mayhem/brackets/
所以我一直在阅读这个关于如何使用 Frida 的教程:https://www.frida.re/docs/functions/我遇到过以下情况: $ ./client 127.0.0.1 connec
委托(delegate)函数返回之前是否需要调用replyHandler?我需要进行几次 Web 服务 API 调用才能回复,以下实现正确吗? func session(_ session: WCSe
下面提到的是我的 textField 委托(delegate)方法,我正在使用 IQKeyBoardSwift 作为智能键盘。我尝试移除我的键盘,但我仍然没有收到任何关于接受“开始触摸”的方法的调用
我有一个表格 View ,其中几乎没有用于数据输入的文本字段和弹出窗口。我想将其中一些表示为强制性的。我不知道如何讨厌星号。任何帮助将不胜感激。 最佳答案 我认为你可以使用自定义 UITableVie
例如,我知道如何使用 numpy 对数组进行切片 v[1, :, :] 现在我想要一个函数将切片 (1,1,None) 作为输入并返回 v[1,:,:] 问题是我不知道如何表示省略号 最佳答案 您可以
修订... 应用程序的关键是与数据库服务器通信。服务器对应用程序的响应都是 XML 格式的。有几个屏幕。例如,屏幕 1 列出了用户的信息,屏幕 2 列出了用户过去的交易,允许新交易,等等。 这是我的
我想知道映射/表示内存的最佳方式是什么。我的意思是,例如,如何描述一个结构及其所有字段都被序列化。 我正在创建一个 RPC 库,它将使用 dwarf 调试数据创建客户端和服务器,因此我需要创建一个函数
如果我有一个实现了两个协议(protocol)的 View Controller : @interface CustomerOperationsViewController : UIViewContr
在 Objective-C 中我可以做这样的事情: @property (nonatomic, weak) id someObject; 如何在swift中做到这一点?我试过这个: let someO
我成功地使用了相当棒的 connection:didReceiveAuthenticationChallenge: NSURLConnectionDelegate 委托(delegate)方法。很酷。
我正在寻找原始数据类型的 @NonNull 等效 Java 注释。我知道原始数据不能为 null,但我找不到替代方法。 我想要实现的在逻辑上等同于: int mPageNumber; public v
我正在学习 Git,如果我能描述代表 Git 存储库的数学结构,那就太好了。例如:它是一个有向无环图;它的节点代表提交;它的节点有代表分支等的标签(每个节点最多一个标签,没有标签使用两次)。(我知道这
我看过很多与委托(delegate)相关的帖子,我想知道引用它们的正确方法。假设我有一个声明如下的对象: @interface MyViewController : UITableViewContro
我有这个类: public class Order { int OrderId {get; set;} string CustomerName {get; set;} } 我也声明下面的变
我是一名优秀的程序员,十分优秀!