CakePHP添加事件监听器

时间:2016-09-06 00:35:57

标签: php cakephp cakephp-3.0

我很难在CakePHP(v3.x)活动中获得最终链接。在我的控制器add方法中,我有公共功能

add() 
{
      $event = new Event('Model.Comment.created', $this, [
            'comment' => $comment
      ]);
      $this->eventManager()->dispatch($event);
}

并设置我的监听器类:

namespace App\Event;

use Cake\Log\Log;
use Cake\Event\EventListener;

class CommentListener implements EventListener {

public function implementedEvents() {
    return array(
        'Model.Comment.created' => 'updatePostLog',
    );
}

public function updatePostLog($event, $entity, $options) {
     Log::write(
    'info',
    'A new comment was published with id: ' . $event->data['id']);
}
}

但无法正确设置侦听器,尤其是我的应用程序知道我的CommentListener类存在。

1 个答案:

答案 0 :(得分:1)

我有完全相同的问题,然后我找到了这篇文章: Events in CakePHP 3 – A 4 step HowTo

它确实为我解决了问题,并描述了您需要的最后一个链接步骤。假设您的Listener类位于应用程序Event下的src文件夹中,您需要做的只是文章中的第4步,我已将其代码示例调整为您的示例:

  

最后我们必须注册这个监听器。为此,我们将使用全局可用的EventManager。将以下代码放在config / bootstrap.php

的末尾
use App\Event\CommentListener;
use Cake\Event\EventManager;

$CommentListener = new CommentListener();
EventManager::instance()->attach($CommentListener);

以上是全球聆听者。也可以根据CakePhp文档(CakePHP 3.x Events System)在Model或Controller + Views层注册事件。它在行之间建议你可以在你需要的层上注册监听器 - 所以可能是AppController回调或beforeFilter方法上的initialize,尽管我只测试了{{ 1}}回调。

从CakePHP 3.0.0开始更新并转发

现在已弃用函数beforeFilter。替换函数称为attach(),因此代码应如下所示:

on()