Yii:将事件附加到模型

时间:2012-09-25 10:20:01

标签: yii yii-components yii-events

我有一个User模型,它捆绑在我的Yii应用程序上安装的模块中。这个模块是第三方,我不想改变它的代码。

我还有一个与用户模型有BELONGS_TO关系的Cv模型。

我的问题是:如何删除用户时删除cv? 我知道我可以在mysql上使用on delete cascade ...来实现这一点。但是,我确实需要删除其他数据,如照片,文件等。

我尝试了什么

我已经创建了一个预装在我的应用程序上的组件。此组件附加到onAfterDelete事件

class EventListener extends CComponent 
{
    public function init() {

        Yii::import("application.modules.users.models.User");

        User::model()->attachEventHandler('onAfterDelete', array($this, 'deleteUser'));
    }


    public function deleteUser($event)
    {
        // stuff here ...
    }
}

然而这不起作用。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

这可能会对你有帮助。

User :: model()是一个单例

$user1 = User::model();
$user2 = new User; // will be used in insert action
$user3 = User::model()->findByPk(10); // will be used in update/delete action

$ user1,$ user2和$ user3是完全不同的对象。 您可以将事件附加到对象,在这种情况下,您必须单独向所有这3个对象添加事件。

$user1->attachEventHandler(...);
$user2->attachEventHandler(...);
$user3->attachEventHandler(...);

看起来Yii没有提供任何在Class级别添加事件的方法。

答案 1 :(得分:1)

嗯,大家好,我刚遇到同样的问题,我就这样解决了:

您应该使用Model的init(),而不是事件侦听器集合类。

在我的情况下,我有devModel类:

    public function init()
{
    parent::init(); 
    $this->onLicenseUpdated = array(new MEventProcessor, 'licenseUpdateHandler');
}

处理程序是MEventProcessor类中的licenseUpdateHandler($ event)。

这样,每次使用模型实例时,它都会为每个对象调用init(),并将事件处理程序附加到此模型的每个实例。

现在,只要为模型调用事件(在我的情况下为onLicenseUpdated()),也会调用处理程序。

答案 2 :(得分:0)

您还可以使用行为

1 - 行为可以监听事件:你只需要覆盖他们的events()方法

类MyBehavior扩展了行为{

public function events() {
    return [
        ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
    ];
}

public function beforeValidate($event) {
    // ...
}

}

2 - 虽然在组件的behavior()方法中将行为附加到组件更常见,但您也可以动态附加它们并保持原始代码不被修改:

use app\components\MyBehavior;

 // attach a behavior object

 $component->attachBehavior('myBehavior1', new MyBehavior);

您可以在这里找到一些有用的文档: