《PHP設計模式介紹》第十五章 表數據網關模式_PHP教程
推薦:《PHP設計模式介紹》第十四章 動態記錄模式到目前為止,您所看到的這些設計模式大大提高了代碼的可讀性與可維護性。然而,在WEB應用設計與開發中一個基本的需求與挑戰:數據庫應用,這些設計模式都沒有涉及到。本章與接下來的兩章—
前一章中使用動態記錄模式對數據庫表進行建立,獲取,更新(通過擴展實現刪除)每一行的操作。動態記錄模式是一種簡單的抽象數據庫連接的方式,但是這種簡潔性也正是它的弱點。動態記錄類只處理單一的行,使得它在需要呈現大量信息的WEB應用中顯得效率很低,如旅游預約,在線購物等。在這一類應用――幾乎是主流的WEB應用中,數據集的使用就是更普遍更流行的。
問題
怎樣才能簡單的操作數據庫表與表中的所有記錄?
解決方案
表數據網關模式集成了動態記錄模式。實際上,這個新模式的大多數代碼都借簽于14章動態記錄模式的代碼(它重用了一樣的DB類與BOOKMARK TABEL DDL常量,并且也用ADOdb作為操縱數據的代碼庫)。然而,表數據網關模式集中于整表――記錄集而不是單個的記錄。
樣本代碼
讓我們從建立操作開始,該操作完成向表中增加新記錄。測試用例函數TableDataGatewayTestCase::testAdd() 完成向書簽數據表中增加兩條URL數據記錄的步驟要求。它很大程度上參照了14章ActiveRecordTestCase::testAdd()方法,但它也其顯著不同的地方,在于引入了一個新的BookmarkGateway這個表數據網關類。
| 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()); } } |
類似于動態記錄,表數據網關測試用例示例了一個模板類,并增加一些記錄到數據庫。然而表數據網關模的工作對象是整張表,你只需建立一個該模式對象,并重用該對象對就能向數據表中增加更多的新記錄。
這兒是BookmarkGateway一個可行的實現。
| 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()); } } } |
以上代碼看上去很熟悉,動態記錄模式與表數據網關模式的基本框架是相仿的:INSERT SQL 語句,函數參數表,對數據庫錯誤的處理等都與動態記錄模式的add()方法一次處理一條記錄相類似。
建立了實現CRUD操作的代碼后,現在來討論如何獲取數據。
測試用例結構
因為表數據網關的目的是處理具有多條記錄的數據庫表,你很有可能需要一個方便有效的方法來初始化表,使得在運行每一個實驗時數據表都處于一個已知的狀態。快速的解決方案是為每個實驗建立一個基類,包括兩個有用的方法:setup()與addSeveralBookmark,用來為每個實驗重建已打亂的表和載入一些數據。
如下就是名為BaseTestCase的類
|
class BaseTestCase extends UnitTestCase { |
現在,每一個測試用例都源自BaseTestCase并繼承它的構造器,一個setup()方法與一個addSeveralBookmarks()方法來預裝一些數據。
分享:《PHP設計模式介紹》第十三章 適配器模式接口的改變,是一個需要程序員們必須(雖然很不情愿)接受和處理的普遍問題。程序提供者們修改他們的代碼;系統庫被修正;各種程序語言以及相關庫的發展和進化。我孩子的無數玩具中有一個簡要地描
- 相關鏈接:
- 教程說明:
PHP教程-《PHP設計模式介紹》第十五章 表數據網關模式
。