我正在编写自己的MVC以便学习它。我几乎所有的东西都“低调”,而且除了模型以外我写的主要东西是由于理解它们有些困难而缺乏可行的例子。
现在,我被告知一个模型应该代表一行,有人告诉我,你的模型类应该更新/插入和删除行,任何涉及获取单行或多行的行 - 一个“finder”类应该使用。
所以...... a)什么是finder类,b)我如何在一个用例中实现它,c)我被告知模型是正确的还是比“finders”有更好的方法?
建议很多:)
答案 0 :(得分:6)
MVC中的M与数据库有关,这是一种常见的误解。 MVC的主要目的是以M不了解VC的方式将表示层与其余应用程序分开。
V和C形成UI,用户可以通过该外层与您的应用程序进行交互。 C处理来自V的所有输入请求,并在需要时委托给M. V显示M中的变化。在基于网络的MVC中,V在内容,表示和行为方面进一步分离,例如, HTML,CSS和JavaScript。
应用程序本身位于M内部。它应该能够从UI中运行隔离。因此,它不仅包括数据访问层,而是几乎所有其他层,而是表示层。它可以,但可能不包含DAL,服务层,域对象等 - 无论您的应用程序需要什么,无论是从RSS源获取数据还是将数据推送到Web服务或发送电子邮件或计算收入等。< / p>
DAL是否应代表单行,表格或其他内容取决于您。它是您架构的必备设计选择。四种常见模式是表数据网关,行数据网关,活动记录和数据映射器。
答案 1 :(得分:0)
答案是陈旧的“依赖”。
模型不必表示单行或行集合(我假设您在这里讨论数据库数据)。您的模型应该用于映射您的业务逻辑实体。只有模型数据的一个子集需要持久性,这可以通过与数据库交互来实现。
如果我们参考Doctrine案例,这就是为什么即将发布的Doctrine 2不会强迫你的模型从一个教义记录基类扩展。
我相信这就是为什么像Zend Framework这样的MVC框架没有为您提供“Zend_Model”概念。您的模型应该逐个实施。
答案 2 :(得分:-1)
CakePHP说:
模型表示数据,并在CakePHP应用程序中用于数据访问。模型通常表示数据库表,但可用于访问存储数据的任何内容,例如文件,LDAP记录,iCal事件或CSV文件中的行。
(http://book.cakephp.org/view/66/Models)
基本上,该模型表示业务数据的持久存储。通常,这是一个数据库。
一旦我们开始谈论数据库和对象,它通常属于备受争议的“对象 - 关系映射”领域,即有多少PHP框架实现模型。
模型通常表示表中的一行,但它也可以是来自多个表的一组行。模型可以用无数种方式表示:从像Doctrine db对象那样复杂和膨胀的东西到像文本文件一样简单的东西。
我表示模型的首选方法是在主表上每个模型一行,与任何相关的父表连接,并包含任何子表的成员对象。有效实现这一点的唯一方法是使用某种类型的“Collection”类,以便可以一次获取所有对象,因此不会进行不必要的查询。
编辑:要直接回答您的问题,是的,如果您想最大限度地减少到数据库的次数,则绝对需要“查找程序”或“收集”类。如果每个模型都是自给自足的,那么你将会做数百个单独的'SELECT FROM table WHERE id = x'查询。 Finder或Collection只能选择多行并将数据转储到Model对象中。
答案 3 :(得分:-2)
您可以将finders实现为模型类的静态方法:
$foo = ModelFoo::find($id)