2019-09-20 14:37:41 2167次浏览 2条回答 0 悬赏 20 金钱

第一次提问,格式有些不太懂,见谅

业务逻辑是这样的:当接口没有收到invite字段时(通过GET方式传到这个接口),需要额外添加一个验证规则:xid,required。
我用Postman测试这个接口时,传过去一个invite还是出错:xid不能为空。
调试:我在load后面加一句 return $model->getErrors() 测试是没有错误信息的,但是我将这句 $model->invite = $invite 移到load前就没有xid不能为空的错误了,个人想不太明白。以下是简化的代码。

AR 模型类 Member

$invite 是 public 声明的一个成员变量,不是来自数据库中的属性

public function rules(){
  $rules = [
    ['username','required'],
];
  if(empty($this->invite)){
    $appendRules = [
      ['xid','required'],
];
$rules = array_merge($rules,$appendRules);
}
return $rules;
}

控制器某方法

$model = new Member();
$post = Yii::$app->getRequest()->post();
$invite = Yii::$app->getRequest()->get('invite');
$model->load($post,'');
$model->invite = $invite
if($model->validate()){
  return 'validate success!';
}else{
  return $model->getErrors();
}

最佳答案

  • gouguoyin 发布于 2019-09-20 16:00 举报

    validate() 方法会在 save()load() 时触发
    另外存在时再验证的规则可以这样写

    ['xid', 'required', 'message' => 'xid不能为空', 'when' => function($model, $attribute){
    return trim($model->invite) ? true : false;
    }]
    
    3 条回复
    回复于 2019-09-20 16:26 回复

    问题就是我在load()后面return $model->getErrors()没有错误信息,如果是load出错了,应该有的啊。load()和validate()应该是有区别的。
    另外用when触发验证确实是可以的,谢谢

    回复于 2019-09-20 17:36 回复

    load()方法并没有执行验证,它会过滤掉rules规则中没有出现的属性;也就是说,如果rules中没有name属性的验证规则,即便你把name传过去,load()方法页不会将值写入到model中;
    你可以单独调用valudate(),然后返回错误

    回复于 2019-09-21 10:27 回复

    嗯,谢谢。我用 validate + return $model->getErros()测试了几次:

    $model->load($post, '');
    //$model->invite = Yii::$app->getRequest()->get('invite');
    if (!$model->validate()){
    return $model->getErrors();exit();}
    

    问题就出在这里了,无论我注释还是不注释赋值给invite那句,都会出现xid不能为空的错误,这与我期望的逻辑不符合

  • 回答于 2019-09-21 13:07 举报

    这种写法还是很少见的,我觉得还是用大众的方法比较好

您需要登录后才可以回答。登录 | 立即注册
PenDon
主管

PenDon 长沙

注册时间:2019-08-21
最后登录:2021-11-19
在线时长:22小时42分
  • 粉丝0
  • 金钱540
  • 威望10
  • 积分860

热门问题