2007年5月15日 星期二

CakePHP使用手冊-Component

轉貼自 http://www.ezluk.org/

第一節



開場白


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。


沒有留言:

網誌存檔

關於我自己

Aspire freedom , Hope to do Soming make self complete ~