Yii 行为和场景

标签 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 保存...),但是如果我有具有完整预览的新用户,我应该再次分离行为吗?

最佳答案

如果将来可以更改条件,我只需将其作为回调参数传递到模型的行为中。

这可以让您更好地控制情况。因此,行为变得更加可重用 - 如果它被多个模型使用,则每个模型的条件可能是唯一的。

下面的示例有点简化,但您应该明白了。

行为:

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/

相关文章:

mysql - 显示左表中的所有数据认为右表缺少一些数据

tree - 教义2 : Tree - Nestedset and InnoDB

Yii db 命令和 CDbCriteria

php - 获取图像包含不再下载

xaml - 如何通过 Xaml 行为设置图像源属性?

c# - Entity Framework Core DeleteBehavior 不采取操作

c# - 编译器琐事 : What is consequence of this code

wpf - 限制 Silverlight/WPF 行为可见性

ajax - Yii Ajax 请求 CSRF 无法验证

Yii 模拟模型