Cakephp事件已注册但未触发


Cakephp Events registered but not firing

嗨,伙计,像很多人一样,我在实现事件到我的Cakephp应用程序中遇到了困难。如果有人能指出我在使用Cakephp v2.7时搞砸了,那就太酷了我还遵循了Martin Bean关于这个主题的教程:http://martinbean.co.uk/blog/2013/11/22/getting-to-grips-with-cakephps-events-system/


我的代码如下:应用程序/事件/UserListener.php

<?php
App::uses('CakeEventListener', 'Event');
class UserListener implements CakeEventListener {
public function implementedEvents() {
    #@:off;
    return array(
        'Model.User.test' => 'test',
        'Model.User.created' => 'sendActivationEmail',
    );
    #@:on;
}
public function test($event) {
    for ($i = 0; $i < 10; $i++) {
        echo "string<br />";
    }
    CakeLog::write('CakeEvents', 'Testevent Fired');
}
public function sendActivationEmail($event) {
}
}
在App/模型/User.php

<?php
App::uses('AppModel', 'Model');
App::uses('Role', 'Model');
App::uses('Clroute', 'Model');
App::uses('CakeEvent', 'Event');
public function afterFind($results, $primary = true) {
    $Event = new CakeEvent('Model.User.test', $this, array(
    #@:off;
            'id' => 66,
            'data' => 'ppx'
        )
    );
    #@:on;
    CakeLog::write('CakeEvents', 'Testevent dispatch in UserModel');
    $this -> getEventManager() -> dispatch($Event);
    if ($results[0]['Salon']['id'] == null) {
        $results[0]['Salon'] = FALSE;
    }
    return $results;
}

在App/Config/bootstrap.php

App::uses('ClassRegistry', 'Utility');
App::uses('UserListener', 'Event');
$user = ClassRegistry::init('User');
$user->getEventManager()->attach(new UserListener());

如果你能帮助我就太好了,因为我真的卡在那里了,Cakephp关于这个主题的文档也有点模糊:-/

提前感谢!!把迈克尔

我建议不要直接在模型中附加事件侦听器(正如您自己的回答所建议的那样)。这在某种程度上违背了使用事件的初衷。使用事件的优点之一是,它允许您开发更易于覆盖的可扩展代码;直接从模型附加侦听器违背了这个概念。

如果你的监听器似乎没有被调用,尽管它附加到你的模型在bootstrap.php,你可能需要全局附加它:-

// In app/Config/bootstrap.php
App::uses('CakeEventManager', 'Event');
App::uses('UserListener', 'Lib/Event');
CakeEventManager::instance()->attach(new UserListener());

这不是将其直接附加到User模型。

删除App/Config/bootstrap.php中的代码,将这一行添加到你的Model中:

$user->getEventManager()->attach(new UserListener());

并确保将其添加到您的模型中:

App::uses('UserListener', 'Event');