2

私は自分のモデルの動作を持っています。動作には beforeFind、beforeSave があり、メソッドでは user_id をオーバーライドします。次のようなものです。

...
public functio beforeSave() {
  $this->owner->user_id = Yii::app()->user->id
}

モデル ユーザーがいますが、新規ユーザーの登録の動作を無効にするにはどうすればよいですか? 保存コード:

$user = new User();
$user->id = 1332;
$user->field1 = 'data';
$user->save();

しかし、保存時に $user->id に null があります (作業動作のため)。私は試した

$user->disableBehaviors(); 
$user->detachBehavior();

結果なし。

多分それは正しい方法ではありませんか?システム内のユーザーを識別するための動作を作成します (ユーザーの何かのみを検索し、ユーザー ID のみで保存します...)。

4

3 に答える 3

1

条件を将来変更できる場合は、モデルから動作にコールバック パラメータとして渡すだけです。

これにより、条件をより細かく制御できます。したがって、動作はより再利用可能になります。複数のモデルで使用される場合、この状態はそれぞれに固有のものになる可能性があります。

以下の例は少し単純化されていますが、アイデアは理解できるはずです。

行動:

class SomeBehavior extends CActiveRecordBehavior
{
    public $trigger;

    public function beforeSave($event)
    {
        if(!call_user_func($this->trigger))
            return;

        // do what you need
        $this->owner->user_id = Yii::app()->user->id;

    }
}

モデル:

class SomeModel extends CActiveRecord
{
    public function behaviors()
    {
        $me=$this;

        return array(
            'some'=>array(
                'class'=>'SomeBehavior',
                'trigger'=>function() use($me){
                    return $me->scenario=='some-scenario';
                }
            )
        );

    }
}

また、PHP 5.3 を使用しています。そのため、コールバックにはクロージャーを使用しtriggerます。PHP のバージョンが 5.3 未満の場合、呼び出し可能なものなら何でも代わりに使用できます。ここをチェックhttp://www.php.net/manual/en/function.is-callable.php

于 2013-05-03T09:42:04.677 に答える
1

動作はメソッドであるため、内部で独自のロジックを宣言できます。

モデルはそのシナリオを認識しているため、条件ごとに異なる配列を返すことに問題はありません:)

誰かの役に立てば幸いです。

于 2015-02-26T22:56:00.350 に答える