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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab 8.4,《DSP using MATLAB》Problem 8.42

代码:%% ------------------------------------------------------------------------%% Output Info about this m-filefprintf(‘\n***********************************************************\n‘);fprintf(‘ Problem 8.42 \n\n‘);banner();%% ------------…

lua的string.gsub初使用

今天在学习lua,熟悉项目代码的过程中,发现string.gsub好高级,所以在此mark下。 以下是lua5.1的官方文档介绍。 string.gsub (s, pattern, repl [, n])Returns a copy of s in which all occurrences of the pattern have been replaced by a …

php对象比较大小,PHP 面向对象:对象的比较

简明现代魔法 -> PHP服务器脚本 -> PHP 面向对象:对象的比较PHP 面向对象:对象的比较2010-04-07在PHP中有 赋值符号、 等于符号 和 全等于符号, 这些符号代表什么意思?当使用比较操作符()时,对象以一种很简单的规则比较&a…

mysql 备份

方法一: 1,暂停Mysql进程或服务 2,复制mysql\data文件夹 3,重新安装程序和mysql, 把 ibdata1及数据库文件夹copy到新目录 4,重启服务 方法二 数据导出:mysqldump -u数据库用户名 -p 要导出的数据库> otc…

php程序变量,PHP 变量

PHP 变量变量是用于存储信息的"容器":实例$x5;$y6;$z$x$y;echo $z;?>运行实例 与代数类似x5y6zxy在代数中,我们使用字母(如 x),并给它赋值(如 5)。从上面的表达式 zxy ,我们可以计算出 z 的值为 11。在 PHP 中&…

为什么构造函数不能是虚函数

为什么构造函数不能是虚函数 从存储空间角度看,使用虚函数时,系统要有一定的空间开销,当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table),他是一个指针数组&…

漏洞:WebRTC 泄漏用户IP

WebRTC又称为“网页即时通信”,是一组API函数,它经过W3C组织的认证,支持浏览器之间的语音通话、视频聊天和P2P模式分享文件。 这个协议主要包括:getUserMedia,RTCPeerConnection,RTCDataChannels&…

怎么在电脑安装php文件夹在哪个文件夹,php进行文件上传时找不到临时文件夹怎么办,电脑自动保存的文件在哪里...

php进行文件上传时找不到临时文件夹怎么办PHP上传文件时找不到临时文件夹怎么办,php上传文件时找不到临时文件夹的解决方案:先打开php.ini配置文件;然后修改内容[upload _ tmp _ dir’ c :/windows/temp ‘],文件夹路径要根据自己…

【SIGGRAPH 2015】【巫师3 狂猎 The Witcher 3: Wild Hunt 】顶级的开放世界游戏的实现技术。...

【SIGGRAPH 2015】【巫师3 狂猎 The Witcher 3: Wild Hunt 】顶级的开放世界游戏的实现技术 作者:西川善司日文链接 http://www.4gamer.net/games/202/G020288/20150811091/计算机图形和交互技术的学术大会【SIGGRAPH 2015】,在北美时间的8月9日到13日召…

php边框圆角,css3圆角和圆角边框使用方法总结

在CSS3出现之前,想要实现圆角的效果可以通过图片或者用margin属性实现,传统的圆角生成方案,需要多张图片作为背景图案。CSS3出现以后,就不需要浪费时间去制作多张图片了,大大的减少了工作量,提高了网页的性…

php中二进制函数,PHP-----函数和二进制

递归-----函数本身调用本身。每一个栈中的变量都是独立的,不受外部变量的影响,除非传参。这一点和Js不一样。在一个php页面中要引用其他的php文件可以使用require,require_once或者include,include_once;require引入的文件如果不存…

关于指针和堆栈

转载:http://blog.qdac.cc/?p2804 【码神】[长春]swish(109867294) 21:17:40 这块要明白一个东西,我们程序所能操作的数据,从CPU的角度来看,只是在寄存器中的那几个东西。剩下的内存中的东西,磁盘上的东西&#xff0c…

php 文件类型 html,HTML的文档类型怎么选择

声明帮助浏览器正确地显示网页。声明(推荐学习:HTML入门教程)Web 世界中存在许多不同的文档。只有了解文档的类型,浏览器才能正确地显示文档。HTML 也有多个不同的版本,只有完全明白页面中使用的确切 HTML 版本,浏览器才能完全正确…

HDOJ 2037 今年暑假不AC 【贪心】

HDOJ 2037 今年暑假不AC 【贪心】 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid2037 给出n个电视节目的开始时间和结束时间, 要求合理安排如果看这些节目可以完整的看完更多节目 策略是观看的节目的长度越短越好,也即节目越早结束我越想看它。…

php 邮件发送验证码,发送验证码邮件有什么好的解决方案?

用户Passport系统,注册,找回密码都是通过邮件发送验证码,有什么好的方案实现。我之前用的是私人的QQ邮箱,发现偶尔系统会来一封邮件要我输入验证码,而且就怕用多了会被腾讯拉黑或者自动移到垃圾箱处理。还有就是什么情…

自定义多列排序:C++/Java实现

前言: 有些时候,我们在编程中会遇到多列排序的需求。假如在execle,这事儿就太easy了。不过没办法,现在就需要你用Java或者C实现这样一个功能! 比如将下表无序的数据通过重排之后按照以下规则显示结果: 1.第二列从大到小…

php的prepare方法,PHP之PDO-prepare

当同一个SQL多次查询(执行)时,只是每次的查询条件(数据)不一样,那么,使用prepare就对了.它可大大减少查询(执行)时间,服务器资源消耗..原型:PDOStatement PDO::prepare(string query [, array driver_options])占位符:1,有名占位符(:named parameters)2,问号占位符(?)如:INSER…

多态,面向对象

/** * 里氏替换原则 : * 能使用父类的地方,一定可以使用子类 * 什么是多态 : * 父类的引用,指向子类的对象 * 多态的前提条件 : * 有继承关系的两个类 * 多态的目的 : * ☆☆☆ 代码的重用 * 多态发什么在什么时候 : * 赋值…

mysql安装im,mysql安装记录

zip下载及安装教程:https://blog.csdn.net/qq_41307443/article/details/79839558我按照步骤操作遇到了一些问题记录一下:1 没有 ini ,文件,自己建立一个新的 .ini文件。自己的系统没显示后缀,我配置了一下;2 启动服务…