我有一个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 ...
}
}
然而这不起作用。
有什么建议吗?
答案 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);
您可以在这里找到一些有用的文档: