通常在專案在執行時,都會需要使用到一些資源,像是 Database 、 Mail 、 Log 等等;在 Zend Framework 中,就把這些資源定義為 Application Resource 。
以下我來介紹 Application Resources 的建立方式及使用方式。
初始化 Resource
在 Zend_Application 執行的過程中,會透過 Bootstrap 物件來將我們需要的 Application Resources 一一初始化。而初始化 Resource 的方法有兩種,分別介紹如下:
在 application.ini 中初始化
Zend Framework 預設已經幫我們建立好了幾個常用的 Application Resources ,請參考官方手冊的「 Available Resource Plugins 」一節。
我們可以在 application.ini 中初始化這些有定義好的 Application Resources ,語法如下:
1
| |
例如我們要初始化單一資料庫,就可以這樣寫:
1 2 3 4 5 6 | |
這個方法要特別注意兩點:
-
如果沒有對應的 Resource 時,就不可以在 application.ini 加入該 Resource 的設定,否則 Zend_Application 會丟出錯誤。
-
如果該 Resource 沒有特別需要指定的選項時,還是要使用以下方法來初始化,以 Modules 這個 Resource 為例:
1resources.modules[] = ; 這是給一個空陣列的意思
在 Bootstrap 中初始化
除了在 application.ini 設定之外,如果大家不希望某些 Application Resource 的設定可以被修改的話,可以考慮在 Bootstrap.php 中來初始化 Application Resource 。
方法很簡單,在 application/Bootstrap.php 裡建立 _init<ResourceName>() 方法,就可以初始化該 Resource 了。以資料庫為例,我們可以在 Bootstrap 類別裡加入 _initDb() 這個方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
記住要把產生的 Resource 物件用 return 敘述回傳,這樣到時候 Bootstrap 物件才可以在其他取得它。
另外要特別注意三點:
-
如果在 Bootstrap 裡有定義 Resource 的話,那麼在 application.ini 中同名的 Resources 就不會被初始化。
-
在 Bootstrap 類別裡所初始化的資源,無法直接取得 application.ini 中的同名設定。
-
在 _init<Resource>() 方法裡透過 $this->getOptions() 所取得的設定,會是整個 application.ini 轉換後的陣列,而非該 Resource 的專屬設定。
取得 Resource 的方法
因為所有的 Resource 都是由 Bootstrap 物件所初始化並存在其內部的 Container 中,所以我們就必須透過 Bootstrap 物件來取得 Resource 。
在 Action Controller 裡可以用以下的方式來取得 Resource :
1 2 3 4 5 6 7 | |
其中 Action Controller 的 getInvokeArg('bootstrap') 可以為我們取得已經建立好的 Bootstrap 物件,我們再透過它來取得我們需要的 Resource 。
自訂 Resource
如果我們所需要的 Resource 是 Zend Framework 沒有提供的話,該怎麼辦呢?這也不是大問題,我們有兩種方式可以達成。
在 Bootstrap 中建立
第一種方式也是一樣在 Bootstrap 類別裡定義 _init<CustomResourceName>() 方法即可。例如我們需要一個名為 Webservice 的 Resource 的話,就可以在 Bootstrap 類別裡加入以下方法:
1 2 3 4 5 6 7 8 | |
不過這樣的方式只能在一個專案中使用,假如我們希望把自訂的 Resource 做成可重覆利用的套件,就可以採用第二種方法。
使用 Resource 類別
第二種方法主要是透過自訂的 namespace 來將 Resource 載入,這樣的方式可以讓我們擴充 Zend Framework 的很多功能。
假設我們有一組 My 套件放在專案的 library 下 (或是 include_path 裡) ,其中有一個My/Application/Resource/Webservice.php 檔,內容如下:
1 2 3 4 5 6 7 8 9 10 11 12 | |
那麼我們可以在 application.ini 中加入以下設定:
1 2 | |
這樣就會讓 Zend Framework 去找尋我們自訂的 Resource 類別檔案。
不過別忘了要在 application.ini 中指定 resources 的設定,這樣才能初始化 Webservice 這個 Resource 。例如:
1 2 | |
這個方法也可以用來取代原來 Zend Framework 預設好的 Resource 類別,以加強原來預設 Resource 的功能;像是在「將 Smarty 3 整合到 Zend Framework 1.11 中」一文裡, My_Application_Resource_View 這個類別就把原有的 View Resource 繼承後再做一些修改,讓專案的 View 可以切換為 Smarty 來使用。
小結
Zend_Application_Resource 是在 Zend Framework MVC 中一個很重要的功能,它不僅能為我們初始化整個專案所需要的資源,同時也幫助我們管理這些資源。這裡我將 Zend_Application_Resource 做了一些粗略的介紹,希望能給大家做為專案開發上的參考。
下次再見。