Component

第一節

開場白

Component可以在特定的狀況協助controller。 component的存在不單單只是為了繼承架構的某一部分而以,它可以被放入各式各樣特殊的功能。

IRC頻道上有個小伙子曾說:A component is a sharable little "controllerette". 我們覺得這是一個很好的定義。事實它,他真正的目的是:重用性。 Component之於Controller就像Helper之於View。 主要的不同點是component封裝了企業邏輯,而helper則封裝顯示邏輯, 這一點非常重要,新手在開始使用重用性時常常搞混。新手常問:我要做XX事,可是它應該是component還是helper呢?! 嗯,答案十分簡單,XX事是做什麼的?是企業邏輯?顯示邏輯?亦或二者都是? 如果是企業邏輯,那麼它就是component。 如果是顯示邏輯,則是helper。 如果二者都是呢?那...他就既是component又是helper! 有個例子屬於最後一種狀況:身分認証系統。 這系統需要同時具有登入,登出,限制存取能力和檢查資源使用的權限(如編輯,新增,刪除等action的使用權限), 這些都是企業邏輯,所以這個認証系統應該是一個component。 但你又想在使用者登入時,於主選單上加入一些選項,而這又是顯示邏輯。

第二章

建立自己的component

要建立一個component,先在app/controllers/components/ 目錄裡加一個檔案,假設建立的檔名叫foo.php。 接著在檔案裡,要依檔名取一個名字宣告成類別(在檔名後面加上'Component'這個字), 這個例子的程式碼應該長得像這樣:

一個簡單的component

class FooComponent extends Object
{
    var $someVar = null;
    var $controller = true;
 
    function startup(&$controller)
    {
        // 這涵式傳入正在載入此component的controller的參照。
        // 在這裡執行controller的初始化。
    }
 
    function doFoo()
    {
        $this->someVar = 'foo';
    }
}
   
要使用這個component,需要在controller的宣告中加入下面的程式碼,將其載入controller裡:

    var $components = array('Foo') 接者,在controller裡就可以這麼用:     $this->Foo->doFoo();   

component可以在startup()方法內呼叫載入它的controller。 startup()會在Controller::beforeFilter()後立即被呼叫。 你可以在beforeFilter方法裡設定component的屬性,接者component便可以利用新的屬性設定,在startup()中做出正確的行為。

譯註:我在這裡被搞混了很久!原來,每一次Action被呼叫時(如http://localhost/posts/view/) 都會建立一個新的PostController物件,所以會依順序發生這些事:
    產生controller > 載入component > beforeFilter > startup > 執行Action

要在component中使用model,可以像這樣建立實體:

    $foo =& new Foo();      

也可以在component內使用其他components。 只要在component中宣告要使用的component就行了。 下面的範例以session component當例子。

    var $components = array('Session');

第三節

開放你的component

如果你覺得自己寫的component對別人有幫助,可以將他加到CakeForge。 如果在社群中使用率越來越高,有一天也有可能被加到核心中發佈。

同樣的,有需要時也可以到http://cakeforge.org/snippet/取得別人供獻的component。


附錄:讀者筆記