Yii行为和场景

时间:2013-05-01 10:23:36

标签: yii behavior

我有我的模型的行为,行为有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中有空(因为工作行为)。  我试过了

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

没有结果。

也许是不对的方式?我创建行为来识别系统中的用户(只查找用户的东西,只保存用户ID ...),但是如果我有新用户的完全优先,我应该再次分离行为?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

由于行为是一种方法,你可以在里面声明自己的逻辑。

模型知道它的场景,因此为不同的条件返回不同的数组没有问题:)

希望对某人有所帮助。

答案 2 :(得分:0)

您可以检查Yii :: app() - user-> isGuest以确定用户是否已登录。或者你可以尝试寻找null。像这样:

if (!Yii::app()->user->isGuest) 
    $this->owner->user_id = Yii::app()->user->id;

if (null !== Yii::app()->user->id)
    $this->owner->user_id = Yii::app()->user->id;