2013-02-15 89 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