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,只需注冊名稱空間 ,以便自動加載器可以找到它。
總結
以上是生活随笔為你收集整理的php数据访问层设计,php - Zend框架数据访问层(DAL) - 堆栈内存溢出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HLS ug871学习
- 下一篇: php边框圆角,css3圆角和圆角边框使