php数据访问层设计,php - Zend框架数据访问层(DAL) - 堆栈内存溢出

好吧,在处理Data Access Layer ,您必须考虑的第一件事是该层还具有子层 ,在现代框架中很难找到名为“ dal”的文件夹(我以Zend为基础框架和Symfony)。

其次,关于ActiveRecord ,您必须知道默认情况下Zend Frameworks 不会实现它 。 大多数教程都采用最简单的方法来教授新概念。 通过简单的示例, 业务逻辑的数量很少,因此,它们没有添加另一层复杂性(在数据库和模型对象之间进行映射),而是通过两种基本模式构成了domain layer (模型): Table Data Gateway和Row Data Gateway 。 对于初学者来说,这是足够的信息。

在对其进行分析之后,您将看到ActiveRecord和行数据网关模式之间的一些相似之处。 主要区别在于ActiveRecord对象(可持久实体) 承载业务逻辑,而行数据网关仅表示数据库中的一行 。 如果在代表数据库行的对象上添加业务逻辑,则它将成为ActiveRecord对象。

此外,在Zend Framework 快速入门之后 , 在域模型部分 ,您将意识到还有另一个组件,它使用了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实例进行交互,该实例使用Table Data Gateway Pattern进行交互。 另一方面, $this->getDbTable->find()返回Zend_Db_Table_Row的实例,该实例实现行数据网关模式 (这是代表数据库行的对象)。

提示: domain object本身的guestbook实体, 并没有通过在DataMapper的的find()方法创建的 ,相反,这个想法是, 对象的创建工厂的任务 ,你必须注入的依赖,以实现所谓的依赖倒置原则(DIP) (SOLID原则的一部分)。 但这是另一个问题,超出了问题的范围。

映射的东西从这里开始:

$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的modules目录和命名空间指南 。

最后提示:我花了很多时间编写自己的数据映射器,以最终意识到,当应用程序与许多相关实体一起增长时,维护对象映射是噩梦 。 (例如,包含对用户对象的引用的Account对象,包含角色的用户等等)在这一点上编写映射内容并不容易。 因此,如果您确实想要一个真正的对象关系映射器,我强烈建议您首先研究遗留框架如何执行此类任务并可能使用它。 因此,使用Doctrine 2可以节省一些时间,这是迄今为止使用DataMapper模式的最佳(IMO) 之一 。

而已。 您仍然可以使用/dal目录存储DataMappers,只需注册名称空间 ,以便自动加载器可以找到它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值