我的模型有一个行为,该行为有 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 保存...),但是如果我有具有完整预览的新用户,我应该再次分离行为吗?
最佳答案
如果将来可以更改条件,我只需将其作为回调参数传递到模型的行为中。
这可以让您更好地控制情况。因此,行为变得更加可重用 - 如果它被多个模型使用,则每个模型的条件可能是唯一的。
下面的示例有点简化,但您应该明白了。
行为:
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。因此,我使用闭包来触发回调。 如果您的 PHP 版本低于 5.3 - 可以使用任何可调用的东西。检查这里http://www.php.net/manual/en/function.is-callable.php
关于Yii 行为和场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16316416/