php数据访问层设计,php - Zend框架数据访问层(DAL) - 堆栈内存溢出
好吧,在處理Data Access Layer ,您必須考慮的第一件事是該層還具有子層 ,在現(xiàn)代框架中很難找到名為“ dal”的文件夾(我以Zend為基礎(chǔ)框架和Symfony)。
其次,關(guān)于ActiveRecord ,您必須知道默認(rèn)情況下Zend Frameworks 不會(huì)實(shí)現(xiàn)它 。 大多數(shù)教程都采用最簡(jiǎn)單的方法來教授新概念。 通過簡(jiǎn)單的示例, 業(yè)務(wù)邏輯的數(shù)量很少,因此,它們沒有添加另一層復(fù)雜性(在數(shù)據(jù)庫(kù)和模型對(duì)象之間進(jìn)行映射),而是通過兩種基本模式構(gòu)成了domain layer (模型): Table Data Gateway和Row Data Gateway 。 對(duì)于初學(xué)者來說,這是足夠的信息。
在對(duì)其進(jìn)行分析之后,您將看到ActiveRecord和行數(shù)據(jù)網(wǎng)關(guān)模式之間的一些相似之處。 主要區(qū)別在于ActiveRecord對(duì)象(可持久實(shí)體) 承載業(yè)務(wù)邏輯,而行數(shù)據(jù)網(wǎng)關(guān)僅表示數(shù)據(jù)庫(kù)中的一行 。 如果在代表數(shù)據(jù)庫(kù)行的對(duì)象上添加業(yè)務(wù)邏輯,則它將成為ActiveRecord對(duì)象。
此外,在Zend Framework 快速入門之后 , 在域模型部分 ,您將意識(shí)到還有另一個(gè)組件,它使用了Data Mapper Pattern 。
因此,如果您的DAL的主要目的是在業(yè)務(wù)對(duì)象(模型)和存儲(chǔ)之間映射數(shù)據(jù),則此任務(wù)的職責(zé)將委托給數(shù)據(jù)映射器 ,如下所示:
class Application_Model_GuestbookMapper
{
public function save(Application_Model_Guestbook $guestbook);
public function find($id);
public function fetchAll();
}
這些方法將與Database Abstraction Layer進(jìn)行交互,并使用數(shù)據(jù)填充域?qū)ο蟆?遵循以下原則:
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實(shí)例進(jìn)行交互,該實(shí)例使用Table Data Gateway Pattern進(jìn)行交互。 另一方面, $this->getDbTable->find()返回Zend_Db_Table_Row的實(shí)例,該實(shí)例實(shí)現(xiàn)行數(shù)據(jù)網(wǎng)關(guān)模式 (這是代表數(shù)據(jù)庫(kù)行的對(duì)象)。
提示: domain object本身的guestbook實(shí)體, 并沒有通過在DataMapper的的find()方法創(chuàng)建的 ,相反,這個(gè)想法是, 對(duì)象的創(chuàng)建工廠的任務(wù) ,你必須注入的依賴,以實(shí)現(xiàn)所謂的依賴倒置原則(DIP) (SOLID原則的一部分)。 但這是另一個(gè)問題,超出了問題的范圍。
映射的東西從這里開始:
$guestbook->setId($row->id)
->setEmail($row->email)
->setComment($row->comment)
->setCreated($row->created);
到目前為止,我想我已經(jīng)回答了您的主要問題,您的結(jié)構(gòu)如下:
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();
}
}
也許您想為數(shù)據(jù)映射器創(chuàng)建一個(gè)單獨(dú)的文件夾。 只是改變:
application/models/GuestbookMapper.php
至
application/models/DataMapper/GuestbookMapper.php
班級(jí)名稱將是
class Application_Model_DataMapper_GuestbookMapper
我已經(jīng)看到您想將domain model objects分成模塊。 同樣,您可能需要遵循ZF的modules目錄和命名空間指南 。
最后提示:我花了很多時(shí)間編寫自己的數(shù)據(jù)映射器,以最終意識(shí)到,當(dāng)應(yīng)用程序與許多相關(guān)實(shí)體一起增長(zhǎng)時(shí),維護(hù)對(duì)象映射是噩夢(mèng) 。 (例如,包含對(duì)用戶對(duì)象的引用的Account對(duì)象,包含角色的用戶等等)在這一點(diǎn)上編寫映射內(nèi)容并不容易。 因此,如果您確實(shí)想要一個(gè)真正的對(duì)象關(guān)系映射器,我強(qiáng)烈建議您首先研究遺留框架如何執(zhí)行此類任務(wù)并可能使用它。 因此,使用Doctrine 2可以節(jié)省一些時(shí)間,這是迄今為止使用DataMapper模式的最佳(IMO) 之一 。
而已。 您仍然可以使用/dal目錄存儲(chǔ)DataMappers,只需注冊(cè)名稱空間 ,以便自動(dòng)加載器可以找到它。
總結(jié)
以上是生活随笔為你收集整理的php数据访问层设计,php - Zend框架数据访问层(DAL) - 堆栈内存溢出的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HLS ug871学习
- 下一篇: 高性能索引设计