裸使用Zend_Layout和Zend_View的
在本文中,我看使用Zend_Layout和Zend_View的還有一個簡單的前端控制器來顯示它是如何可能開始分離業務邏輯和表示在您的應用程序。 所有代碼可以在GitHub:
裸使用Zend_Layout和Zend_View的GitHub上 。
MVC的
一種常見的設計模式是對現代Web應用程序的MVC模式。 在Zend框架中的'全棧'模式是一個實現了MVC中的PHP和由三部分組成:
- 模型(M)
- 視圖(V)
- 控制器(三)
該模式是這樣設計的業務和表示邏輯的完全分離,彼此(與業務邏輯模型,並介紹在視圖)和控制器坐在中間開展“樂團”。
介紹和邏輯
在Zend Framework的看法是處理兩個主要組件:Zend_View的和使用Zend_Layout。 使用Zend_Layout顧名思義照顧佈局方面的網站(一般頁眉,頁腳,工具條等)。 Zend_View的主要論點集中於介紹你的模型的數據一直致力於生產或派生。
作為開發人員,和他們的應用,發展我們傾向於通過移動各個階段,每一個進步,一般在上,提高可維護性和可擴展性。 其中一個主要問題是,演示和邏輯仍然得到它不是簡單的混合,並開始把二者割裂。
出了什麼問題混合兩種?
有幾種原因混合不同部位的應用,例如一個設計師的工作在您的網站可能不希望(或有知識)掃描周圍的代碼試圖找出其中的變化來進行簡報。 以同樣的方式開發(如果你像我誰擁有設計技能鴕鳥)可能爆發了一身冷汗,當你提及或UI設計工作。
此外,如果以後你想展示你的網站上不同的媒體,如移動電話,平板電腦,或使數據通過網絡服務(的XML / JSON的/等)? 經混合介紹和邏輯分析,你的立場幾乎沒有希望沒有一些很醜陋的黑客演示拉回到了你的代碼,然後注入新的東西。 如果數據已被分離和演示使這些幾乎是微不足道的變化,創建一個新的視圖腳本的新格式和直接要求適當。
把二者割裂
在一個不斷發展的應用它不總是經濟開始實施全面的解決方案和應用程序的MVC需要遷移緩慢 - 有時運行舊代碼的同時,新的。 而或許有群眾邏輯(如數據庫連接設置,身份驗證,cookie處理等),都沒有準備好成型到您所選擇的框架設置,因此,舊的和已知將要工作的代碼可以繼續使用直至此時可重寫 /重構。
注:使用Zend_Layout和Zend_View的人都覺得這是完全可以接受Zend框架內景觀和框架的設計,使各個組件可以使用,不用其餘的框架。 一個很大的優勢在不斷變化的應用和可能的主要原因之一,其高吸收的企業應用。
前端控制器
下面我創建一個前端控制器 - 一個單一的文件,旨在拿起任何要求,這是不匹配的文件,該文件系統。 這通常是通過使用一個。htaccess文件,如一個用在Zend Framework的默認安裝。 在前台控制器我會成立我們的佈局和視圖,並顯示在不同部位的應用滑了進去。
定義('APP_PATH',目錄名(譯註)。'/..'); / /開始輸出緩衝 ob_start(); / /創建一個 Zend_View的實例 使用Zend_Layout::startMvc(); $佈局 =使用Zend_Layout::getMvcInstance(); $佈局> setLayoutPath(APP_PATH。'/佈局 /腳本') - >“setViewSuffix('phtml') “ - > setLayout('指數'); = $ $視圖佈局 -> getView() - >“setScriptPath(APP_PATH。'/查看/腳本') - >“addHelperPath(APP_PATH。'/圖書館 / Zend的/查看/助手','Zend_View_Helper'); / /設置相應的網址 - 確定 * *幾乎赤身露體,但你不需要這個! Zend_Controller_Front::getInstance()方法 - >“setBaseUrl(使用$ _SERVER ['HTTP_HOST']); 嘗試 { / ** *執行某些應用程序的路由... * - 可以使用此作為一個前端控制器和導演的所有要求 *通過此一文件(提供的文件不存在於文件系統 * - 請注意下面的方法是唯一真正用於演示,這將是 *可怕的一個大型網站 * / 開關(使用$ _GET ['頁']){ 凱斯指數': 案'例外': $ $ _GET這個網頁名= ['頁']; 打破; 默認: $網頁名= 0; 打破; } / /示例頁面不被人發現 ... 如果(假=== $頁面名稱){ $ responseHeader ='HTTP/1.1的404找不到網頁'; 拋出新的異常('找不到網頁'); } / ** *添加數據到視圖對象在這裡 *你可能有自己的控制器實現或部分包括文件 *其中部分原因是業務邏輯視圖邏輯分離 * / $視圖 -> displayText ='您好由勞合社; $視圖 -> buttonText ='我\'米不活躍'; $佈局>“內容 = $視圖”渲染(“{$頁面名稱}。phtml”); 迴聲 $佈局“渲染(); }趕上(例外$五){ / /清理出已緩衝的內容 - 我們不希望顯示的! ob_clean(); 如果(!使用isset($ responseHeader)){ $ responseHeader ='HTTP/1.1的500內部服務器錯誤'; } 頭($ responseHeader); $視圖 ->例外=減; $佈局>“內容 = $視圖”渲染('error.phtml'); 迴聲 $佈局“渲染(); }
首先,我們開始輸出緩衝,這樣,我們可以設置我們的頭在任何時候,在請求書和知道它有可能給他們。 如果一個異常被拋出的任何階段執行的代碼,我們清理這個緩衝區並寫出或錯誤消息的內容和佈局。 這將確保我們不提供部分呈現的內容包含錯誤給最終用戶。
接下來一個新的MVC實例使用Zend_Layout產生,我們告訴它了佈局腳本的擴展名是phtml,是被發現在目錄之外的公共道路,我們的默認佈局被稱為指數(。phtml)。 從佈局,我們然後提取視圖對象(這是我們設置我們的數據進行提交),並採用類似的設置。
接下來我們設置的視圖對象的引用,默認 Zend_View的傭工。 查看傭工套額外的便利功能。 例如,寫了一個漂浮在貨幣格式,或者創建一個斑馬條紋表(他們可以讀到此處 )。 通過擴展 Zend_View_Helper_Abstract和添加自己的庫在這一點上它可以使用自己的應用程序視圖助手。
其餘的應用程序代碼現在包裝在一個 try {} {}塊捕獲。 如果有什麼拋出一個未捕獲的異常,我們可以捕獲它,並顯示一個不錯的錯誤信息到最終用戶。
我們的首要任務在try {} {}趕上我們的要求是路線,什麼是用戶想看看嗎? 在這裡,我實現了一些非常簡單的演示代碼,其中我檢查價值的'頁'獲取變量。 您的路由可以是非常複雜得多。 路由是用來調用什麼都需要執行的代碼獲得 /處理由用戶提供的數據,並告訴系統什麼看法(可能佈局腳本)使用。
最終,如果我們的路由器不符合任何網頁上設置了一個 404響應代碼,並顯示一個漂亮的頁面沒有找到消息給最終用戶。 在這裡,我們拋出和捕獲自己的異常(和一個非常一般的異常在了),但也許你會拋出自己的異常從路由器代碼。
一旦我們成功地傳送我們的要求,我們可以開始做一些與代碼。 這可能是你有你自己的控制器/模型實施或您包括一些代碼的分離已經有點。 在這裡,我設置了幾個簡單的變量到視圖對象。
一旦完成,我們只是提供意見與我們的數據。 如果代碼拋出一個未捕獲的異常,這是因為任何原因被困近底部的腳本。 在這裡,我們已經明確的緩衝輸出,建立一個 500響應頭,並告訴我們的應用程序來呈現'錯誤'視圖腳本(通常是一個更精簡的版本正常佈局 /視圖,記錄錯誤檢查後)。
作為視圖呈現先注入佈局有可能改變佈局內的看法,確實需要額外設置,例如,
- 網頁標題
- Meta標籤
- 腳本(網址或代碼)到<head>部分
- 添加額外的樣式等
此外它甚至可以改變整個佈局內的觀點,使用...
<?PHP的$這個 ->“佈局()” - > setLayout('alternativeLayout')?> ...需要時。
終於 ...
我希望這是一個有用的介紹使用Zend_Layout和Zend_View的,它將使你開始實現自己的基本的MVC和改善maintainibility /擴展你的代碼。 請大家看看例子的源代碼的使用(請參閱自述文件說明)。
該代碼假定你已經有了自動裝填工作(或者你有包括所需的類)。 此外,我不會建議你實現路由或數據設置如上所述,這是非常簡化了示範。 要查看完整的代碼來看看源代碼鏈接在頂部的這篇文章。
Zend Framework的版本:1.10.6


















































寫得很好,最翔實,謝謝!