Jor*_*dge 2 php database-abstraction codeigniter
在 CodeIgniter 用户指南中,示例模型对相应数据库表中的每个字段都有一个属性:
class Blogmodel extends CI_Model {
var $title = '';
var $content = '';
var $date = '';
//...
Run Code Online (Sandbox Code Playgroud)
然而,当它返回一组博客文章时,它们只是通用对象。
function get_last_ten_entries()
{
$query = $this->db->get('entries', 10);
return $query->result();
}
Run Code Online (Sandbox Code Playgroud)
如果每篇博文都只是一个通用对象,那么类开头的属性的目的是什么?
似乎将每篇博客文章都作为一个完全成熟的模型对象填充它的内容会很好。然后您可以编写在内部获取值的方法。但是,用户指南中的所有示例似乎都显示每个控制器具有每个模型的一个实例,并使用该对象获取包含数据库值的通用对象。此外,示例实例化模型的方式 ( $this->load->model('Blog');) 很明显,您只需要在控制器中拥有模型的一个实例。
如果我的博客文章有一个status作为整数存储在数据库中的值,但在几个不同的控制器中,我想将该值显示为人类可读的字符串,我应该把那个函数/方法放在哪里?由于我需要在多个控制器中使用它,并且它特定于一个对象,因此我认为它应该是模型对象的一种方法。如果每篇博文都是模型的一个实例,我可以这样写:
function get_human_status()
{
$lookup = array(
1 => 'Active',
2 => 'Hidden',
3 => 'Pending');
return $lookup[$this->status];
}
Run Code Online (Sandbox Code Playgroud)
但是,如果每篇博客文章都是一个通用对象,则它必须如下所示:
function get_human_status($data)
{
$lookup = array(
1 => 'Active',
2 => 'Hidden',
3 => 'Pending');
return $lookup[$data->status];
}
Run Code Online (Sandbox Code Playgroud)
哪种方式更符合 CodeIgniter 的习惯?假设是第二个,为什么示例模型定义了这些内部属性?
最后,为了加分,如果我还有其他类似的问题,我应该看哪些书、文章或例子?
Ehh .. 名为“CodeIgniter”的灾难。
在那个糟糕的框架的文档中,他们将“模型”描述为实现活动记录模式的实例。这就是为什么您会在该类的定义中获得无意义的属性。这只是 AR 模式中两个职责(存储和逻辑)之间冲突的另一个副作用。此外,您可能会注意到var关键字,它是 PHP4 的产物。
你所谓的“模型”不是。它们是简单的域对象,而后者又是模型的一部分。模型层是一种心理构造,就像 MVC 设计模式中的另一层 - 表示层。
该$this->load->model()方法不会初始化“模型”实例。这只是 CodeIgniters 缺乏适当的自动加载器的另一个例子。此方法仅用于包含包含Blog类的文件。因此,您不能断定“博客”我应该是一个单一的对象。
控制器不应该“显示”任何东西。有改变当前视图实例和模型层的状态。视图应该处理表示逻辑,选择如何显示内容以及使用哪些模板。视图不应该是愚蠢的模板。
至于教育材料,你会发现在这篇文章的末尾丢失了讲座和书籍。你也可能这个和这个有点相关。