新一代的PHP框架Zend Framework 2 誕生了,它基于Zend Framework 1,僅支持PHP 5.3,它將在未來一年里取代其舊版本。
初探
因為熟悉Zend Framework 1,我決定進入2.x beta版本,看看有什么變化,并測試對已有的程序是否有影響。
Rob Allen寫過一個教程很適合那些從沒用過Zend Framework框架的人。你可以通過git克隆(或下一個zip包)來安裝框架,并增加一些應用模塊。
如果你想玩一個已經(jīng)寫好的框架程序,那么一個包含了實現(xiàn)數(shù)據(jù)庫表的CRUD模塊的程序,比起僅僅是“HelloWorld”的程序要好很多。
框架之所以好,是因為它已經(jīng)包含一些功能模塊及.htaccess。所以你只需要在Apache上配置,就可以運行起來。以前,一個新手在創(chuàng)建程序之前都要先配置好Zend Framework 1,我不敢說第一次使用Zend_Tool和ZF都是那么簡單。
現(xiàn)在讓我們來看看新框架的變化 - 目錄結(jié)構(gòu):
每個模塊代碼(類)都是從配置和視圖模板中分離的,而不是強迫分開于控制器、模型、服務和其他對象。
這也意味著,理論上你想去掉在一個應用模塊,只需要去掉一個單獨的文件夾。但這并不意味著模塊之間沒有關(guān)聯(lián),例如:兩個步驟的視圖布局,就可以指定使用其他的模塊。這只需要將兩個模塊的配置合并成一個。
新標準
作為一個新的主要版本,該框架也采用新標準,并中斷對之前版本的兼容性,就像Symfony 2。
1.僅支持PHP 5.3,使用類的命名空間,不再使用下劃線來分隔虛擬包。
2.采用PSR-0 autoloading,所有模塊都在src/文件夾下,所以不再匹配類名和文件名。
3.不再有接口后綴的命名。
4.異常采用接口,所以PHP 5.3的異常是由一個模塊繼承和實現(xiàn)的(例如:Zend\Json\Interface)。
5.不再有下劃線前綴來強調(diào)私有(private)和保護(protected)的屬性和方法。
從上述可見,新標準并沒有帶來什么革命性的標志,而是它讓Coder在寫新代碼的時候減少了一些負擔的。
不完全輕量
配置有點長,但控制得當:例如,鍵名'di',在一個模塊的配置文件中包含所有的類及參數(shù)。可能有人覺得整個框架變得意外的復雜了,但我們不得不接受,為了使用其全部的特性。
另一個點,我覺得有必要提的是Module.php的配置。它被定義成自動加載的模式,這是很標準的做法。這樣我們就不會苦惱于如何加載它們。
控制器相對于Zend Framework 1變得輕量了:它們在注入對象的時候可以指定setter,而不是去搜索周圍的對象。這并不是一個什么神奇的功能:因為你可以在配置中指定setter的列表,并將引導你去思考它們的關(guān)聯(lián)性及數(shù)量??偟膩碚f控制器減輕了,甚至(理論上)可實例化。
Action返回一個視圖模型,所以使他們不需要知道視圖對象:
01 |
class AlbumController extends ActionController |
06 |
protected $albumTable ; |
08 |
public function indexAction() |
11 |
'albums' => $this ->albumTable->fetchAll(), |
15 |
public function setAlbumTable(AlbumTable $albumTable ) |
17 |
$this ->albumTable = $albumTable ; |
與1.x的相似點
一些慣例和API與Zend Framework 1一致,這意味著你不需要再次學習它們:
1.控制器的API及其助手:在控制器里你可以獲得請求,及其他混合特征,如重定向。
2.表單允許定義元素(標簽、驗證和過濾器),并在子類中提供的初始化方法init()。
3.視圖通常遵循文件夾結(jié)構(gòu)<controller>/<action>.phtml;同樣$this可調(diào)用escape()和url()等視圖變量。
基本數(shù)據(jù)庫的支持也是基于Table Data Gateway 類及其擴展。當然你可以選擇整合Doctrine2或其他ORMs。
總結(jié)
請注意下面的問題:為什么我要使用Zend Framework 2來替代Symfony 2? 提供一個觀點:ZF2相對于使用Zend Framework 1的程序來說,有更簡單容易的代碼升級方式,并且你已經(jīng)有了ZF的使用經(jīng)驗。此外,它的設(shè)計并不落后于Symfony,而且不用全部重寫。
|