【问题标题】:Form model validation atleast 1 field is required in Yii REST UpdateYii REST 更新中需要表单模型验证至少 1 个字段
【发布时间】:2016-09-08 08:36:22
【问题描述】:

我是 Yii 框架的新手,我陷入了检查天气的简单任务中,用户是否为更新请求提供了任何输入。

考虑以下代码

型号代码:

 class Car extends ActiveRecord {
       public $id;
       public $name;
       public $registration;
       public $created_at;

       public function sceanrios(){
          return ['create'=>['name','registration'],
                  'update'=>['name','registration']];
       }  

       public function rules(){
          return [['name','registration'],'required','on'=>'create']
       }
    }

控制器:

class CarController extends yii\rest\ActiveController{
   public $modelClass = 'models/Car';
}

当我向 CarController 发送 PUT 请求而不发布任何属性时,它会给出 200 OK 响应。

我想要一个验证规则来检查用户是否实际发布了任何值,然后在更新后返回 OK;否则返回错误消息“至少一个字段应设置为更新”

我发现以下解决方案 Yii2 dependency custom rule validation 仅适用于 POST 请求,即在创建场景中,但它不适用于更新场景,因为 $this->attribute 包含旧值。

另一个具有相同问题的解决方案 Yii form model validation- either one is required 不适用于 PUT 请求

发现许多其他的,它们只适用于新记录,而不适用于更新现有记录。

有这方面的验证器吗?

【问题讨论】:

    标签: php yii yii2 yii2-advanced-app


    【解决方案1】:

    我自己根据@silverFire 的想法开发了解决方案,并在此处发布了答案。我们只需要一个验证回调函数来检查脏属性。所以 Car 类如下:

    class Car extends ActiveRecord {
               public $id;
               public $name;
               public $registration;
               public $created_at;
    
               public function sceanrios(){
                  return ['create'=>['name','registration'],
                          'update'=>['name','registration']];
               }  
    
               public function rules(){
                  return [
                          [['name','registration'],'required','on'=>'create'],
                          [['name','registration'], 'atLeastOne' 'on'=>'update'],
                        ];            
    
               }
    
               public function atLeastOne($attribute, $params)
               { 
                     if(empty($this->getDirtyAttributes(['name','registration'])){
                         $this->addError($attribute, "Nothing to update"); 
                     }
               }  
            }
    

    【讨论】:

      【解决方案2】:

      【讨论】:

      • Hello @SilverFire 在 AtLeastValidator 类的第 97 行我们可以看到这行代码 $value = $model->$attributeName;这与我之前尝试过的相同,它仅适用于新记录...不适用于更新现有记录。
      • 您可以在模型init()方法中将两个属性的值都设置为null,然后必须填充其中一个
      • 在这种情况下,如果用户只传递姓名,这将用 null 覆盖注册
      • 是的,但是你说过你只需要其中一个 :) 你可以使用$model->getDirtyAttributes(['name']) 而不是$model->name 来检查某些属性的修改值
      • 再读一遍这个问题,我说了任何一个,但是我使用 $model->getDirtyAttributes(['name','registration']); 的想法开发解决方案;发布完整的答案
      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 2011-07-21
      • 2020-08-20
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      相关资源
      最近更新 更多