3

Yiiアプリケーションにインストールされているモジュールにバンドルされているユーザーモデルがあります。このモジュールはサードパーティであり、コードを変更したくありません。

BELONGS_TOユーザーモデルと関係のある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 に答える
0

Behaviorsを使用することもできます。

1 - 動作はイベントをリッスンできます: events() メソッドをオーバーライドするだけです

class MyBehavior extends Behavior {

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

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

}

2 - コンポーネントの behaviors() メソッドで動作をコンポーネントにアタッチするのがより一般的ですが、それらを動的にアタッチして、元のコードを変更しないままにすることもできます。

use app\components\MyBehavior;

 // attach a behavior object

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

ここに役立つドキュメントがいくつかあります。

于 2015-10-06T18:11:58.407 に答える