Yii REST Update

时间:2016-09-08 08:36:23

标签: php yii yii2 yii2-advanced-app

我是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->属性保存旧值。

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

发现许多其他人只会为新记录工作,但不会更新现有记录。

是否有任何验证器?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

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