初探 Zend Framework 上的 Context 輸出(转)
来源:http://www.jaceju.net/blog/archives/1188/
在 Zend Framework 1.5 版之後就支援了對 Ajax Context 的處理,讓我們可以在 Controller 裡的 Action 輸出不同的格式的內容,以下我將簡單介紹這個功能。
Context 的概念與實作
在 Zend Framework 中,不同格式的輸出內容稱為 Context ;每個 Action 都可以輸出不同的 Context ,例如 JSON 、 XML 等等。
如果同一個 Action 要輸出不同格式的內容時,我們可以透過一個叫做 ContextSwitch 的 Action Helper 來幫我們切換 Context 。 ContextSwitch Helper 主要的原理是看有沒有接收到 format 這個參數,如果有的話,就會以該種格式的 Context 輸出。
Zend Framework 預設提供可切換的 Context 格式有 JSON 和 XML 兩種,而 HTML 本身雖然也是一種 Context ,但因為它是在沒有 format 這個參數的狀況下的直接輸出,所以並不需要用 ContextSwitch 特別指定;也就是說,不給 format 的話, Zend Framework 預設會拋出該網址的 HTML ,而不是 JSON 或 XML 。
輸出 JSON
假設我們有個專案叫 ajaxtest ,它的網址是 http://localhost/ajaxtest/ 。現在我們想要讓首頁可以輸出 JSON ,我們可以在 Action Controller 的 init 方法中透過 ContextSwitch Helper 設定:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
|
透過 ContextSwitch 的 addActionContext ,我們可以幫 indexAction 加入一個 JSON 格式的 Context 輸出;然後再透過 initContext 方法, ContextSwitch Helper 就會判斷目前的網址來做 Context 切換的動作。
現在我們只要在瀏覽器網址列輸入 http://localhost/ajaxtest/?format=json ,就能得到以下的輸出結果:
1
|
|
輸出 XML
不過除了 JSON 格式的 Context 預設不需要樣版之外,其他格式的 Context 都預設都需要準備一個對應的樣版;而這些樣版都會使用 Zend_View 來處理,所以如果你的 View 是用 Smarty ,那麼 ZF 也會用 Smarty 來處理 Context 樣版。
Context 樣版的檔名規則就是 action-name.context-suffix.view-suffix ,這裡的 context-suffix 是 Context 指定的字尾,通常會和 Context 名稱相同;而 view-suffix 就是副檔名,預設是 phtml。
假設現在我們要讓首頁支援 XML 的輸出,那麼首先我們要在 /path/to/ajaxtest/application/views/scripts/index/ 路徑 (就是放 index.phtml 的那個路徑) 下,再按照前述的規則加入一個 index.xml.phtml 檔,內容如下:
1
2
3
4
|
|
註: XML 的內容規格要看實際需求來訂定,這邊提供的是簡易的範例。
而因為 index.xml.phtml 也是透過 Zend_View 處理,所以這裡我們可以將它當做是 View Script 來處理。
接著我們在 Controller 的 init 方法裡再加入新的 XML Context :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
|
完成後在瀏覽器網址列輸入 http://localhost/ajaxtest/?format=xml ,就能得到以下結果:
1
2
3
4
|
|
自訂 Context
除了 JSON 和 XML 之外,我們也可以自訂 Context ,例如 RSS 、 ATOM 等。例如我們想讓首頁支援 RSS ,那麼也一樣是在 View Scripts 目錄下放置一個 index.rss.phtml (參照上面的規則) ,例如:
1
2
3
4
5
6
7
|
|
然後我們要透過 contextSwitch 的 addContext 方法,加入自訂的 RSS Context 格式,當然也別忘了將 RSS Context 格式加入 index Action 裡:
1
2
3
4
|
|
在 addContext 的第二個參數裡,我們可以指定 Context 的規格,一般來說只要加入 suffix 這個規格即可,它就是前面提到的 context-suffix 。
AjaxContext
在預設打開 Layout 的狀況下, Zend Framework 丟出來的 HTML 是當然是包含 Layout ,而 ContextSwitch 這個 Helper 目前只對有註冊的 Context 關掉 Layout (也就是有指定 format) 。可是當我們指定 format 為 html 時,就會發現程式出現錯誤,因為我們沒有註冊 HTML 這個 Context 。
而改用 AjaxContext 這個 Action Helper 的話,它就會幫我們註冊 HTML 這個 context ;而它是繼承 ContextSwitch 這個 Helper ,所以也保有它完整的功能。
但是使用 AjaxContext 要注意幾個地方:
-
AjaxContext 不會使用預設的 action-name.view-suffix 這個樣版,因為它的 context-suffix 是 ajax ,所以我們要多加一個 View Script 叫 action-name.ajax.view-suffix 。
-
AjaxContext 一定要 Request 是 XMLHttpRequest 才會動作,也就是說必須透過前端 JavaScript 以 XMLHttpRequest 物件來呼叫,這裡和 ContextSwitch 是不一樣的。
AjaxContext 使用方式如下:
1
2
3
|
|
如果 index.ajax.phtml 和 index.phtml 的內容是一樣的話,那麼可以將 index.ajax.phtml 改為:
1
|
|
讓它直接抓取 index.phtml 的內容即可。
心得
以前我在處理不同格式輸出時,總是會在 Action 裡加了很多判斷,不僅看起來雜亂,而且也不易維護。
雖然後來我在自定的架構裡做了自動化,但總覺得還是不夠漂亮。而當我認真將 Zend Framework 在處理 Context 這部份的做法仔細研究之後,發現 Zend Framework 確實是讓這件事變得簡單很多。
當然這也只是基礎而已,但是只要將這些基本技巧摸熟之後,相信大家一定也可以想出更棒的應用方式!
謝謝收看。

浙公网安备 33010602011771号