好吧,在处理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,只需注册名称空间 ,以便自动加载器可以找到它。

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

  1. c 传图片数据给matlab,c++ - 如何通过UDP将数据从C ++应用程序发送到Matlab并进行绘制 - 堆栈内存溢出...

    我想使用Winsock通过UDP将数据从我的C ++应用程序发送到Matlab,并实时绘制数字. 例如:我得到了从1到10的数字,我想从C ++发送1,在Matlab中接收它,将其放在图形上(图,条等 ...

  2. 关于数据导出的一些经验总结,包括excel页面负载跟堆内存溢出

    数据导出的基本思路 通过查询数据库中的数据,生成excel文件 @PostMapping("/exportExcelAll")public AjaxResult exportExc ...

  3. java跨域解析json数据_java后台设计简单的json数据接口,设置可跨域访问,前端ajax获取json数据...

    在开发的过程中,有时候我们需要设计一个数据接口.有时候呢,数据接口和Web服务器又不在一起,所以就有跨域访问的问题. 第一步:简单的设计一个数据接口. 数据接口,听起来高大上,其实呢就是一个简单的Se ...

  4. java中mypoiexception,java - 如何使用Poi获取Java中单元格的数据验证源? - 堆栈内存溢出...

    此问题包含多个不同的问题. 首先,我们需要获取工作表的数据验证,然后为每个数据验证获取数据验证所适用的Excel单元格范围. 如果该单元格位于该单元格范围之一中,并且数据验证是列表约束,则进行进一步处 ...

  5. android 按钮 叠加,android - 叠加层按钮在Android 4.3中不起作用 - 堆栈内存溢出

    我在WindowManager.LayoutParams.TYPE_TOAST级别层上有一个带按钮的覆盖视图. 该按钮在Android 4.2中可以正常工作,但是当我在Android 4.3中运行相同 ...

  6. java.nio.file 找不到_java - 断言该错误:无法访问路径(找不到java.nio.file.Path) - 堆栈内存溢出...

    我想使用Robolectric进行单元测试,但是我正在尝试使用robolectric进行简单测试,因此一开始我很困惑. 我遵循了手册,对示例进行了同样的操作,甚至其他帖子也无济于事. 每次收到错误消息 ...

  7. arcgis怎么用python重新排序_python - 根据排序数据添加新的顺序ID号(ArcGIS) - 堆栈内存溢出...

    我需要一行代码,它将根据我为数据规定的顺序发出新的顺序ID. 基本上,在按照我的喜好对数据进行排序后,原始的Object_Id对我来说不再是有意义的顺序. 在我的表中,我创建了一个新字段(短整数). ...

  8. linux上clisp运行lisp,apache - 重新访问linux + apache2 + mod_lisp + CLISP - 堆栈内存溢出

    CLISP已安装并成功运行: (加载" modlisp-clisp")(modlisp:modlisp-server)运行正常,即无休止 Python可通过localhost在/ ...

  9. python从html拿到数据,python - 使用BeautifulSoup和Python从HTML文件中提取数据 - 堆栈内存溢出...

    我需要提取的数据可以在不同的标题下找到. 这是我到目前为止: from BeautifulSoup import BeautifulSoup ecj_data = open("data\ec ...

最新文章

  1. 过渡元素最外层电子数_元素周期表
  2. web 点击劫持 X-Frame-Options
  3. 如何下载python软件-python如何下载
  4. CodeForces - 501C Misha and Forest(拓扑排序)
  5. [github] - git使用小结(分支拉取、版本回退)
  6. 什么是G1垃圾回收算法
  7. 采用我国国产处理器的超级计算机是,“中国芯”超级电脑合肥诞生 首次采用国产CPU芯片...
  8. FreeBSD是一种UNIX操作系统
  9. zsh关于.zprofile .zlogin .zshrc .zshenv文件中环境变量的加载
  10. (素材源码) 猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习
  11. 安卓手机浏览器_chrome浏览器插件安卓下载-chrome apk手机版下载v4.8.2安卓版
  12. Gulp browserify livereload
  13. 有史以来最伟大的软件开发书籍(国外篇)
  14. 简单的Site to site ipsec ×××实验
  15. Spring使用java代码配置Web.xml进行访问service
  16. ipv6-hosts
  17. 浅释丹道筑基功―—―混元桩【转载】
  18. Python 一键导出微信读书的书籍和笔记
  19. linux 修改路由表 永久,CentOS 6.9永久设置静态路由表以及路由表常用设置
  20. 做Android开发摸鱼是要付出代价的,被主管劝退,我后悔了!

热门文章

  1. 前端学习(1604):脚手架props与state
  2. 前端学习(1324):anysc关键字
  3. java学习(57):内部类
  4. 树莓派Raspberry 操作GPIO--LED
  5. 2020年周记(2/50)
  6. pandas 合并所有列_图解Python表格操作包Pandas
  7. laravel常用响应操作
  8. java的内存模型--jmm
  9. 致我的2018 你好2019
  10. 阿里云服务器邮件发送