2013-02-15 87 views
1

我想知道如果這是一個好主意,在模型的PHP文件中註冊一個Model類作爲CakeEventListener。註冊一個模型作爲一個事件監聽器

例如,如果我創建了一個名爲Document的模型來實現偵聽器,並且在Document.php的底部,我將其註冊爲一個偵聽器。

class Document extends AppModel implements CakeEventListener 
{ 
    ..... 
} 

CakeEventManager::instance()->attach(ClassRegistery::init('Document')); 

我的問題是關於nexted調用ClassRegistery::init('Document'),如果上面會引起Document兩個實例被創建。

例如,假設我在我的控制器中有以下內容。

class DocumentsController extends AppController 
{ 
    public function index() 
    { 
     $model = ClassRegistery::init('Document'); 
     ..... 

Document實例化了多少次?

  • 第一次從控制器調用ClassRegistery::init('Document')加載Document.php文件。
  • 從Document.php befoe底部不會有第二次調用ClassRegistery::init('Document')第一個調用已完成?

這會以某種方式在CakePHP中註冊註冊表嗎?

回答

2

這應該不成問題。 ClassRegistry::init()只實例化對象一次。隨後調用init()返回現有對象。

但是,我會建議在Document的__construct函數中註冊偵聽器。這樣感覺更乾淨,因爲我們沒有將自執行的PHP與類文件混合在一起。它還允許稍後注入,這對於單元測試是有用的。

+0

謝謝,但如果我把它放在構造中,那麼我會從執行:: init()調用中調用:: init()。你明白嗎?這就是爲什麼我想知道這是否是一個問題。 – cgTag 2013-02-15 18:24:15

+1

如果您傳遞'$ this'而不是使用類註冊表來重新初始化它,則不適用。 – jeremyharris 2013-02-15 18:50:08