zendframework一直為人所詬病的缺點就是不能優雅的處理領域邏輯,這裡談談我的一些解決思路:
先看看一般情況下我們都是怎麼寫model,controller的:
model的一般寫法:
class articles extends zend_db_table
controller的一般寫法:
class articlescontroller extends zend_controller_action
public function createaction()
else
} public function readaction()
public function updateaction()
else
} public function deleteaction()
else }}
通常我們說:rich model is better。在上面的例子中可以明顯看出:model**很少,controller**很多。一般來說這是壞味道的前兆,不過上面的crud例子比較 簡單,而且model通過繼承獲得了一定的crud能力,也可以說是很rich的,所以這個問題並不要緊,真正的考驗是當應用包含大量的邏輯的時候怎麼 辦。
所謂邏輯大致分兩種,一種是應用邏輯,一種是領域邏輯。對乙個文章物件來說,文章新增成功後傳送一封郵件通知就屬於應用邏輯,而怎麼判斷是不是熱門文章就是領域邏輯。
應用邏輯和領域邏輯劃分的原則就是看是否有技術的味道。有就是應用邏輯,沒有就是領域邏輯。之所以這樣劃分是因為物件導向強調重用性,而領域邏輯是乙個軟體的靈魂所在,只有剝離了技術味道才有更大的重用可能性。
在zendframework裡,我們可以把controller看作是應用層,因為它自然的勾畫了用例,所以把應用邏輯放在controller裡是說 得過去的,而領域邏輯則無論如何要保證百分百在model裡。在通常的zendframework**裡,model的角色一般是由 zend_db_table來扮演的。zend_db_table屬於乙個表資料入口的實現。表資料入口是操作乙個表的模式,而我們的物件往往只是乙個 行,所以很多領域邏輯不太可能加在zend_db_table的層次上,而應該是zend_db_table_row的層次。
下面看如何把領域邏輯融合到zend_db_table_row中:
首先自定義乙個row類:
class article extends zend_db_table_row
} 然後讓row類能掛接到table類之上:
class articles extends zend_db_table
這個時候,就可以通過row類來使用包含領域邏輯的方法(比如:ishot方法)了:
$article = $this->_articles->fetchrow("id = 1");
if ($article->ishot()) else
我上面所做的一切的一切,目的只有乙個:就是要把zend_db_table_row變成rich model!
在Zend Framework 中實現Ajax
開發平台 windows xp sp2 測試平台 freebsd 7.0 開發工具 netbeans 6.1 使用框架 zend framework 1.5.2 資料庫 mysql 5.0.51a 一 表 mysql select from news id title add time 22 rot...
Zend Framework 中的認證和授權淺見
兼談許可權系統設計的一些問題 zend framework 作為 php 的乙個官方程式設計框架,剛一推出來就引起了震動,大家把它簡稱為 zf 看來 php 已經在尋求向企業開發市場進軍。但是由於推出時間短,熟悉 zf 的開發人員,特別是國內的程式設計師,對 zf 了解的還不多。現在市面上還找不到一...
Zend Framework 中的認證和授權淺見
兼談許可權系統設計的一些問題 zend framework 作為 php 的乙個官方程式設計框架,剛一推出來就引起了震動,大家把它簡稱為 zf 看來 php 已經在尋求向企業開發市場進軍。但是由於推出時間短,熟悉 zf 的開發人員,特別是國內的程式設計師,對 zf 了解的還不多。現在市面上還找不到一...