CakePHP 添加事件监听器

Kyl*_*lan 5 php cakephp cakephp-3.0

我正在努力让 CakePHP (v3.x) 事件中的最终链接正常工作。在我的控制器add方法中我有公共功能

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

并设置我的监听器类:

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']);
}
}
Run Code Online (Sandbox Code Playgroud)

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

小智 6

我遇到了完全相同的问题,然后我发现了这篇文章:\n CakePHP 3 \xe2\x80\x93 中的事件 A 4 步骤操作方法

\n

它确实为我澄清了事情,并描述了您需要的最后一个链接步骤。假设您的 Listener 类位于应用程序Event下的文件夹中src,您所需要做的就是本文中的步骤 4,我已将其代码示例改编为您的示例:

\n
\n

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

\n
\n
use App\\Event\\CommentListener;\nuse Cake\\Event\\EventManager;\n\n$CommentListener = new CommentListener();\nEventManager::instance()->attach($CommentListener);\n
Run Code Online (Sandbox Code Playgroud)\n

上面是一个全局监听器。还可以根据 CakePHP 文档(CakePHP 3.x 事件系统)在模型或控制器+视图层上注册事件。它暗示您可以在所需的层上注册侦听器 - 因此可能在回调或方法AppController上注册侦听器,尽管我只测试了回调。beforeFilterinitializebeforeFilter

\n

从 CakePHP 3.0.0 开始更新并向前

\n

该功能attach()现已被弃用。调用替换函数on(),因此代码应如下所示:

\n
use App\\Event\\CommentListener;\nuse Cake\\Event\\EventManager;\n\n$CommentListener = new CommentListener();\nEventManager::instance()->on($CommentListener); // REPLACED \'attach\' here with \'on\'\n
Run Code Online (Sandbox Code Playgroud)\n