《PHP設(shè)計模式介紹》第十五章 表數(shù)據(jù)網(wǎng)關(guān)模式_PHP教程
推薦:《PHP設(shè)計模式介紹》第十四章 動態(tài)記錄模式到目前為止,您所看到的這些設(shè)計模式大大提高了代碼的可讀性與可維護(hù)性。然而,在WEB應(yīng)用設(shè)計與開發(fā)中一個基本的需求與挑戰(zhàn):數(shù)據(jù)庫應(yīng)用,這些設(shè)計模式都沒有涉及到。本章與接下來的兩章—
前一章中使用動態(tài)記錄模式對數(shù)據(jù)庫表進(jìn)行建立,獲取,更新(通過擴(kuò)展實(shí)現(xiàn)刪除)每一行的操作。動態(tài)記錄模式是一種簡單的抽象數(shù)據(jù)庫連接的方式,但是這種簡潔性也正是它的弱點(diǎn)。動態(tài)記錄類只處理單一的行,使得它在需要呈現(xiàn)大量信息的WEB應(yīng)用中顯得效率很低,如旅游預(yù)約,在線購物等。在這一類應(yīng)用――幾乎是主流的WEB應(yīng)用中,數(shù)據(jù)集的使用就是更普遍更流行的。
問題
怎樣才能簡單的操作數(shù)據(jù)庫表與表中的所有記錄?
解決方案
表數(shù)據(jù)網(wǎng)關(guān)模式集成了動態(tài)記錄模式。實(shí)際上,這個新模式的大多數(shù)代碼都借簽于14章動態(tài)記錄模式的代碼(它重用了一樣的DB類與BOOKMARK TABEL DDL常量,并且也用ADOdb作為操縱數(shù)據(jù)的代碼庫)。然而,表數(shù)據(jù)網(wǎng)關(guān)模式集中于整表――記錄集而不是單個的記錄。
樣本代碼
讓我們從建立操作開始,該操作完成向表中增加新記錄。測試用例函數(shù)TableDataGatewayTestCase::testAdd() 完成向書簽數(shù)據(jù)表中增加兩條URL數(shù)據(jù)記錄的步驟要求。它很大程度上參照了14章ActiveRecordTestCase::testAdd()方法,但它也其顯著不同的地方,在于引入了一個新的BookmarkGateway這個表數(shù)據(jù)網(wǎng)關(guān)類。
| class TableDataGatewayTestCase extends UnitTestCase { function testAdd() { $gateway = new BookmarkGateway($conn = DB::conn()); $gateway->add( ‘http://simpletest.org/’, ‘SimpleTest’, ‘The SimpleTest homepage’, ‘testing’); $gateway->add( ‘http://blog.casey-sweat.us/’, ‘My Blog’, ‘Where I write about stuff’, ‘php’); $rs = $this->conn->execute(‘select * from bookmark’); $this->assertEqual(2,$rs->recordCount()); $this->assertEqual(2,$conn->Insert_ID()); } } |
類似于動態(tài)記錄,表數(shù)據(jù)網(wǎng)關(guān)測試用例示例了一個模板類,并增加一些記錄到數(shù)據(jù)庫。然而表數(shù)據(jù)網(wǎng)關(guān)模的工作對象是整張表,你只需建立一個該模式對象,并重用該對象對就能向數(shù)據(jù)表中增加更多的新記錄。
這兒是BookmarkGateway一個可行的實(shí)現(xiàn)。
| class BookmarkGateway { protected $conn; public function __construct($conn) { $this->conn = $conn; } const INSERT_SQL = “ insert into bookmark (url, name, description, tag, created, updated) values (?, ?, ?, ?, now(), now()) “; public function add($url, $name, $description, $group) { $rs = $this->conn->execute( self::INSERT_SQL ,array($url, $name, $description, $group)); if (!$rs) { trigger_error(‘DB Error: ‘.$this->conn->errorMsg()); } } } |
以上代碼看上去很熟悉,動態(tài)記錄模式與表數(shù)據(jù)網(wǎng)關(guān)模式的基本框架是相仿的:INSERT SQL 語句,函數(shù)參數(shù)表,對數(shù)據(jù)庫錯誤的處理等都與動態(tài)記錄模式的add()方法一次處理一條記錄相類似。
建立了實(shí)現(xiàn)CRUD操作的代碼后,現(xiàn)在來討論如何獲取數(shù)據(jù)。
測試用例結(jié)構(gòu)
因?yàn)楸頂?shù)據(jù)網(wǎng)關(guān)的目的是處理具有多條記錄的數(shù)據(jù)庫表,你很有可能需要一個方便有效的方法來初始化表,使得在運(yùn)行每一個實(shí)驗(yàn)時數(shù)據(jù)表都處于一個已知的狀態(tài)�?焖俚慕鉀Q方案是為每個實(shí)驗(yàn)建立一個基類,包括兩個有用的方法:setup()與addSeveralBookmark,用來為每個實(shí)驗(yàn)重建已打亂的表和載入一些數(shù)據(jù)。
如下就是名為BaseTestCase的類
|
class BaseTestCase extends UnitTestCase { |
現(xiàn)在,每一個測試用例都源自BaseTestCase并繼承它的構(gòu)造器,一個setup()方法與一個addSeveralBookmarks()方法來預(yù)裝一些數(shù)據(jù)。
分享:《PHP設(shè)計模式介紹》第十三章 適配器模式接口的改變,是一個需要程序員們必須(雖然很不情愿)接受和處理的普遍問題。程序提供者們修改他們的代碼;系統(tǒng)庫被修正;各種程序語言以及相關(guān)庫的發(fā)展和進(jìn)化。我孩子的無數(shù)玩具中有一個簡要地描
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁面代碼執(zhí)行時間
- PHP中獎概率的抽獎算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪問控制的和運(yùn)算符優(yōu)先級介紹
- 關(guān)于PHP語言構(gòu)造器介紹
- php/js獲取客戶端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國語言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
- 相關(guān)鏈接:
復(fù)制本頁鏈接| 搜索《PHP設(shè)計模式介紹》第十五章 表數(shù)據(jù)網(wǎng)關(guān)模式
- 教程說明:
PHP教程-《PHP設(shè)計模式介紹》第十五章 表數(shù)據(jù)網(wǎng)關(guān)模式
。