嗯,在处理Data Access Layer 时首先要考虑的是,这一层也有子层,在现代很难找到名为“dal”的文件夹框架(我以 Zend Framework 和 Symfony 为基础)。
其次,关于ActiveRecord,您必须知道默认情况下 Zend Frameworks 不实现它。大多数教程采用最简单的方法来教授新概念。通过简单的示例,业务逻辑的数量是最少的,因此他们没有增加另一层复杂性(数据库和模型对象之间的映射),而是用两个基本模式组成domain layer(模型):@ 987654321@ 和Row Data Gateway。这对于初学者来说已经足够了。
分析之后,你会发现ActiveRecord之间有一些相似之处
和 行数据网关 模式。主要区别在于
ActiveRecord 对象(持久实体)承载业务逻辑和
行数据网关只代表数据库中的一行。如果你添加
表示数据库行的对象上的业务逻辑,然后它将
成为 ActiveRecord 对象。
此外,按照 Zend Framework 快速入门,on the domain model section,您会发现还有第三个组件,它使用了Data Mapper Pattern。
因此,如果您的DAL 的主要目的是在业务对象(模型)和您的存储之间映射数据,则此任务的责任委派给数据映射器,如下所示:
class Application_Model_GuestbookMapper
{
public function save(Application_Model_Guestbook $guestbook);
public function find($id);
public function fetchAll();
}
这些方法将与Database Abstraction Layer 交互并使用数据填充域对象。类似这样的事情:
public function find($id, Application_Model_Guestbook $guestbook)
{
$result = $this->getDbTable()->find($id);
if (0 == count($result)) {
return;
}
$row = $result->current();
$guestbook->setId($row->id)
->setEmail($row->email)
->setComment($row->comment)
->setCreated($row->created);
}
如您所见,Data Mappers 与使用 表数据网关模式 的 Zend_Db_Table 实例交互。另一方面,$this->getDbTable->find() 返回Zend_Db_Table_Row 的实例,它实现了行数据网关模式(它是一个表示数据库行的对象)。
提示:domain object 本身,guestbook
实体,不是由 DataMapper 上的 find() 方法创建的,
相反,这个想法是对象创建是工厂的任务
并且您必须注入依赖项才能实现所谓的
Dependency Inversion Principle (DIP)(SOLID 原则的一部分)。但那是
另一个主题,超出了问题的范围。我建议你
访问以下链接http://youtu.be/RlfLCWKxHJ0
映射的东西从这里开始:
$guestbook->setId($row->id)
->setEmail($row->email)
->setComment($row->comment)
->setCreated($row->created);
到目前为止,我想我已经回答了你的主要问题,你的结构如下:
application/models/DbTable/Guestbook.php
application/models/Guestbook.php
application/models/GuestbookMapper.php
因此,就像 ZF 快速入门中一样:
class GuestbookController extends Zend_Controller_Action
{
public function indexAction()
{
$guestbook = new Application_Model_GuestbookMapper();
$this->view->entries = $guestbook->fetchAll();
}
}
也许您想为数据映射器创建一个单独的文件夹。只需更改:
application/models/GuestbookMapper.php
到
application/models/DataMapper/GuestbookMapper.php
类名将是
class Application_Model_DataMapper_GuestbookMapper
我看到您想将您的 domain model objects 分成模块。也可以,只要关注ZF的目录和namespace guidelines for modules即可。
最后提示:我花了 很多时间 编写自己的数据映射器
终于意识到维护对象映射是一场噩梦
您的应用程序随着许多相关实体的增长而增长。 (即帐户
包含对用户对象的引用的对象,用户包含
角色,等等)在这写映射的东西并不容易
观点。所以我强烈推荐你,如果你真的想要一个真正的
对象关系映射器,首先研究遗留框架如何执行
这样的任务,也许使用它。
所以,花点时间来Doctrine 2,这是
使用 DataMapper 模式的迄今为止最好的 (IMO) 之一。
就是这样。您仍然可以使用您的/dal 目录来存储DataMappers,只需register the namespace,以便自动加载器可以找到它。