3

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

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

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

我试过的

我创建了一个预加载在我的应用程序上的组件。此组件附加到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 ...
    }
}

但是,这不起作用。

有什么建议么 ?

4

3 回答 3

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 没有提供任何在类级别添加事件的方法。

于 2012-09-25T11:43:05.910 回答
1

好吧,伙计们,我刚刚偶然发现了同样的问题,我以这种方式解决了它:

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

就我而言,我有 devModel 类:

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

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

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

现在任何时候为模型调用事件(在我的情况下为 onLicenseUpdated()) - 也将调用处理程序。

于 2016-04-03T18:32:52.887 回答
0

您也可以使用Behaviors

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);

你会在这里找到一些有用的文档:

于 2015-10-06T18:11:58.407 回答