Yii REST 更新中至少需要 1 个字段的表单模型验证

Form model validation atleast 1 field is required in Yii REST Update

我是 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 响应。

我想要一个验证规则来检查用户是否实际发布了任何值,然后 return 更新后确定; else return 错误信息 "Atleast one field should be set to update"

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

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

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

这个有验证器吗?

是的,有一个code-on-yii/yii2-at-least-validator

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

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"); 
                 }
           }  
        }