Php 将模型注册为事件侦听器

Php 将模型注册为事件侦听器,php,cakephp,cakephp-2.3,Php,Cakephp,Cakephp 2.3,我想知道在模型的PHP文件中将模型类注册为CakeEventListener是否是一个好主意 例如,如果我创建了一个实现侦听器的名为Document的模型,并在Document.php的底部将其注册为侦听器 class Document extends AppModel implements CakeEventListener { ..... } CakeEventManager::instance()->attach(ClassRegistery::init('Document'

我想知道在模型的PHP文件中将模型类注册为CakeEventListener是否是一个好主意

例如,如果我创建了一个实现侦听器的名为Document的模型,并在Document.php的底部将其注册为侦听器

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

CakeEventManager::instance()->attach(ClassRegistery::init('Document'));
我的问题是关于对
ClassRegistery::init('Document')
的nexted调用,以及上述调用是否会导致创建
Document
的两个实例

例如,假设我的控制器中有以下内容

class DocumentsController extends AppController
{
     public function index()
     {
         $model = ClassRegistery::init('Document');
         .....
文档
实例化了多少次

  • 控制器对
    ClassRegistery::init('Document')
    的第一次调用加载Document.php文件
  • 在Document.php
    befoe
    第一次调用完成之前,不会有第二次从Document.php的底部调用
    ClassRegistery::init('Document')

这会不会在CakePHP中分散注册表?

这应该不是问题
ClassRegistry::init()
只实例化一次对象。对
init()
的后续调用返回现有对象


然而,我建议在文档的
\u构造
函数中注册侦听器。这感觉更干净,因为我们没有将自执行PHP与类文件混合。它还允许以后可能的注入,这对单元测试很有用。

谢谢,但如果我将其放入构造中,那么我将从正在执行的::init()调用中调用::init()。你明白吗?这就是为什么我想知道这是否是一个问题。如果您传递
$this
而不是使用类注册表再次初始化它,则不是这样。