我有我的模型的行为,行为有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 ...),但是如果我有新用户的完全优先,我应该再次分离行为?
答案 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;