PHP程序员站--PHP编程开发平台
 当前位置:主页 >> PHP高级编程 >> 高级应用 >> 

PHP设计模式介绍 第十五章 表数据网关模式

PHP设计模式介绍 第十五章 表数据网关模式

来源:互联网  作者:  发布时间:2010-05-22
前一章中使用动态记录模式对数据库表进行建立,获取,更新(通

回顾表数据网关,你应该理解findByTage()的工作原理了。

class  BookmarkGateway  {
//  ...
public  function  findByTag($tag)  {
$rs  =  $this->conn->execute(
‘select  *  from  bookmark where  tag  like  ?’
,array($tag.’%’));
return  new  AdoResultSetIteratorDecorator($rs);
}
}

更新记录

下面,让我们来解决CRUD中的“更新”。从概念上讲,你应该让表装满数据,找到一个数据对象,改变后保存它,并且再次找到该数据并校检更改是否存储。

返回到TableDataGatewayTestCase,这儿有查找记录的代码

class  TableDataGatewayTestCase  extends  BaseTestCase  {
//  ...
function  testUpdate()  {
$gateway  =  new  BookmarkGateway(DB::conn());
$this->addSeveralBookmarks($gateway);
$result  =  $gateway->findByTag(‘php’);
$bookmark  =  $result->current();
$this->assertIsA($bookmark,  ‘ADOFetchObj’);
$this->assertEqual(
‘http://blog.casey-sweat.us/’
,$bookmark->url);
$this->assertEqual(
‘PHP  related  thoughts’
,$bookmark->description);
}
}

并且将代码改为如下所示:

class  TableDataGatewayTestCase  extends  BaseTestCase  {
//  ...
function  testUpdate()  {
$gateway  =  new  BookmarkGateway(DB::conn());
$this->addSeveralBookmarks($gateway);
$result  =  $gateway->findByTag(‘php’);
$bookmark  =  $result->current();
$this->assertIsA($bookmark,  ‘ADOFetchObj’);
$this->assertEqual(
‘http://blog.casey-sweat.us/’
,$bookmark->url);
$this->assertEqual(
‘PHP  related  thoughts’
,$bookmark->description);
$new_desc  =  ‘A  change  to  see  it  is  updated!’;


$bookmark->description  =  $new_desc;
$gateway->update($bookmark);
}
}

改变后,重新查找该条记录并验证更新

class  TableDataGatewayTestCase  extends  BaseTestCase  {
//  ...
function  testUpdate()  {
The Table Data Gateway Pattern   257
$gateway  =  new  BookmarkGateway(DB::conn());
$this->addSeveralBookmarks($gateway);
$result  =  $gateway->findByTag(‘php’);
$bookmark  =  $result->current();
$this->assertIsA($bookmark,  ‘ADOFetchObj’);
$this->assertEqual(
‘http://blog.casey-sweat.us/’
,$bookmark->url);
$this->assertEqual(
‘PHP  related  thoughts’
,$bookmark->description);
$new_desc  =  ‘A  change  to  see  it  is  updated!’;
$bookmark->description  =  $new_desc;
$gateway->update($bookmark);
$result  =  $gateway->findByTag(‘php’);
$bookmark  =  $result->current();
$this->assertEqual(
‘http://blog.casey-sweat.us/’
,$bookmark->url);
$this->assertEqual(
$new_desc
,$bookmark->description);
}
}

有了这样一个实验用例在手,现是在增加update()方法到BookmarkGateway类的时候了。

class  BookmarkGateway{
//  ...
const  UPDATE_SQL  =  ‘update  bookmark  set url  =  ?
,name  =  ?
,description  =  ?
,tag  =  ?
,updated  =  now()
where  id  =  ?’;
public  function  update($bookmark)  {
$this->conn->execute(
self::UPDATE_SQL
,array(
$bookmark->url
,$bookmark->name
,$bookmark->description
,$bookmark->tag
,$bookmark->id
));
}

BookmarkGateway知道如何去执行SQL来更新数据,并能正确的将数据传输对象的属性的值映射到SQL语句相应的参数位置。

讨论

用表数据网关在对表进行操作,是与WEB应用中任务的执行更密切相关的。然而,表数据网关仍然与数据库表具体结构关系过于紧密(耦合)。将代码从表具体结构的依赖中独立出来将是下一章数据映射模式的主题。


延伸阅读:
从魔兽看PHP设计模式
《PHP设计模式介绍》导言
PHP设计模式介绍 第一章 编程惯用法
PHP设计模式介绍 第二章 值对象模式
PHP设计模式介绍 第三章 工厂模式
PHP设计模式介绍 第四章 单件模式
PHP设计模式介绍 第五章 注册模式
PHP设计模式介绍 第六章 伪对象模式
PHP设计模式介绍 第七章 策略模式
PHP设计模式介绍 第八章 迭代器模式


PHP设计模式介绍 第九章 观测模式
PHP设计模式介绍 第十章 规范模式
PHP设计模式介绍 第十一章 代理模式
PHP设计模式介绍 第十二章 装饰器模式
PHP设计模式介绍 第十三章 适配器模式
PHP设计模式介绍 第十四章 动态记录模式
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号