【问题标题】:CakePHP add event listenerCakePHP 添加事件监听器
【发布时间】:2016-09-06 00:35:57
【问题描述】:

我正在努力让 CakePHP (v3.x) 事件中的最终链接正常工作。在我的 Controler 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 类存在的情况下。

【问题讨论】:

  • 是否显示一些错误或警告?
  • 不,运行,但我什么也没做,我知道我错过了将两者联系在一起的部分,我不确定它是如何实现的。
  • 查看文档:book.cakephp.org/3.0/en/core-libraries/… 我很困惑这些行的去向: // 将 UserStatistic 对象附加到订单的事件管理器 $statistics = new UserStatistic(); $this->Orders->eventManager()->on($statistics);

标签: php cakephp cakephp-3.0


【解决方案1】:

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

它真的为我清除了一切,并描述了您需要的最后一个链接步骤。假设您的 Listener 类位于您应用程序的 src 下的 Event 文件夹中,您所需要做的就是本文中的第 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 层上注册事件。它建议您可以在所需的层上注册侦听器 - 因此可能是 beforeFilter 回调或 initialize 方法上的 AppController,尽管我只测试了 beforeFilter 回调。

从 CakePHP 3.0.0 起更新

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

use App\Event\CommentListener;
use Cake\Event\EventManager;

$CommentListener = new CommentListener();
EventManager::instance()->on($CommentListener); // REPLACED 'attach' here with 'on'

【讨论】:

猜你喜欢
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
相关资源
最近更新 更多