表单模型验证在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';
}

当我发送PUT请求到CarController没有张贴任何属性,它给出200 OK响应。

我想要一个验证规则,检查用户是否已经张贴了任何值,然后在更新后返回OK;否则返回错误消息"至少有一个字段应该被设置为更新"

我发现以下解决方案Yii2依赖自定义规则验证只适用于POST请求,即在创建场景中,但在更新场景中不起作用,因为$this->属性保留旧值。

具有相同问题的另一种解决方案Yii表单模型验证-任何一种都是必需的,但不适用于PUT请求

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

有验证器吗?

我自己从@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"); 
                 }
           }  
        }

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