網站製作學習誌

記錄學習製作網站的一切

Zend_Application_Resource 簡介

通常在專案在執行時,都會需要使用到一些資源,像是 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
resources.<resource_name>.<settings> = <value>

例如我們要初始化單一資料庫,就可以這樣寫:

1
2
3
4
5
6
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "username"
resources.db.params.password = "password"
resources.db.params.dbname = "test"
resources.db.isDefaultTableAdapter = true

這個方法要特別注意兩點:

  • 如果沒有對應的 Resource 時,就不可以在 application.ini 加入該 Resource 的設定,否則 Zend_Application 會丟出錯誤。

  • 如果該 Resource 沒有特別需要指定的選項時,還是要使用以下方法來初始化,以 Modules 這個 Resource 為例:

    1
    
    resources.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
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initDb()
    {
        $db = Zend_Db::factory('pdo_mysql', array(
            'host' => "localhost",
            'username' => "username",
            'password' => "password",
            'dbname' => "test",
        ));
        Zend_Db_Table::setDefaultAdapter($db);
        return $db;
    }
}

記住要把產生的 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
public function indexAction()
    {
        $bootstrap = $this->getInvokeArg('bootstrap');
        if ($bootstrap->hasResource('webservice')) {
            $webservice = $bootstrap->getResource('webservice');
        }
    }

其中 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
protected function _initWebservice()
    {
        $resource = array(
            'url' = "http://domain.com/webservice",
            'timeout' = 10,
        );
        return $resource;
    }

不過這樣的方式只能在一個專案中使用,假如我們希望把自訂的 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
<?php
require_once 'Zend/Application/Resource/ResourceAbstract.php';
class My_Application_Resource_Webservice
    extends Zend_Application_Resource_ResourceAbstract
{
    public function init()
    {
        $options = $this->getOptions();
        $resource = array($options);
        return $resource;
    }
}

那麼我們可以在 application.ini 中加入以下設定:

1
2
Autoloadnamspaces[] = "My_"
pluginPaths.My_Application_Resource_ = "My/Application/Resource"

這樣就會讓 Zend Framework 去找尋我們自訂的 Resource 類別檔案。

不過別忘了要在 application.ini 中指定 resources 的設定,這樣才能初始化 Webservice 這個 Resource 。例如:

1
2
resources.webservice.url = "http://domain.com/webservice"
resources.webservice.time = 10

這個方法也可以用來取代原來 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 做了一些粗略的介紹,希望能給大家做為專案開發上的參考。

下次再見。

Comments