2016-09-06 228 views
1

我正在努力獲取CakePHP(v3.x)事件工作中的最終鏈接。在我的Controler add方法我有公共職能CakePHP添加事件監聽器

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類存在。

+0

它是否顯示一些錯誤或警告? –

+0

不,運行,但我沒有做任何事情,我知道我錯過了將兩者聯繫在一起的那一點,我不確定它是如何實現的。 –

+0

看文檔: http://book.cakephp.org/3.0/en/core-libraries/events.html#registering-listeners 我很困惑這些行的去向: //附加UserStatistic對象訂單的活動經理 $ statistics = new UserStatistic(); $ this-> Orders-> eventManager() - > on($ statistics); –

回答

1

我有相同的問題,然後我發現這個職位: Events in CakePHP 3 – A 4 step HowTo

這真是茅塞頓開,我和介紹,你是需要這最後鏈接步驟。假設你的監聽器類是Event文件夾中的應用程序的src下,所有你需要做的就是在文章中第4步,我已經適應他們的代碼示例,以你的例子:

最後,我們必須要註冊這個聽衆。爲此,我們將使用全局可用的EventManager。將下面的代碼在你的配置月底/ 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回調函數,所以可能使用beforeFilter回調或initialize方法中的AppController

更新爲3.0.0的CakePHP和轉發

attach()現在已經棄用的功能。替換函數被稱爲on(),因此代碼應如下所示:

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

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