由于验证失败,TimestampBehavior无法正常工作

时间:2017-09-05 08:32:47

标签: validation yii2 behavior

我有以下课程TimestampBehaviour

/**
 * @property int    $id
 * @property string $name
 * @property int    $created_at
 */
class Workspace extends yii\db\ActiveRecord {

    public static function tableName() {
        return 'workspace';
    }

    public function behaviors() {
        return [
            [
                'class'      => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => 'created_at',
                    ActiveRecord::EVENT_BEFORE_UPDATE => false,
                ],
                'value' => date('Y-m-d H:i:s')
            ],
        ];
    }
    ...
}

由于某种原因,该行为不会填充该属性。当我尝试保存模型($workspace->save())时,它总是空的。由于验证失败(“created_at不能为空”),我无法保存。这堂课没什么特别的。什么都没有被覆盖。可能是什么问题?

2 个答案:

答案 0 :(得分:1)

事实证明,验证规则引起了麻烦。出乎意料,因为我认为一切都是正确的。这些是我的规则:

public function rules() {
    return [
        [['id', 'name', 'created_at'], 'required'],
        [['id'], 'int'],
        [['name'], 'string', 'max' => 100],
        [['created_at' ], 'datetime'],
    ];
}

created_at一定不能 - 这就是问题所在。

甚至documented

  

因为此行为会自动设置属性值,   它们通常不是用户输入,因此不应进行验证,   即created_at和updated_at不应出现在rules()方法中   该模型。

执行$workspace->save()时,第一步是验证。只有在该步骤之后,才会触发EVENT_BEFORE_INSERT / EVENT_BEFORE_UPDATE,这会导致TimestampBehaviour填充指定的字段。只有在验证成功的情况下才会发生这种情况! (如果你var_dump你确实会看到一个空的created_at。)太晚了,验证已经发生,我已经得到了验证错误。

推荐的解决方案是从必需的规则中删除created_at。当然,其他方法也是可能的(例如关闭验证或传递在调用save()时应该验证的属性。)

答案 1 :(得分:0)

添加类似下面的行为

public function behaviors()
{
    return [
        [
            'class' => TimestampBehavior::className(),
            'createdAtAttribute' => 'create_time',
            'updatedAtAttribute' => 'update_time',
            'value' => new Expression('NOW()'),
        ],
    ];
}

并将其添加到模型类中的安全记录中。

public function rules()
{
    return array(
        array('create_time,update_time', 'safe'),
    );
}