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

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

模型知道它的场景,所以针对不同的条件返回不同的数组是没有问题的:)

希望它对某人有所帮助。

于 2015-02-26T22:56:00.350 回答
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 回答
0

你可以检查 Yii::app()-user->isGuest 来判断用户是否登录。或者您可以尝试寻找空值。像这样:

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;
于 2013-05-01T12:50:54.830 回答