我是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请求
发现许多其他人只会为新记录工作,但不会更新现有记录。
是否有任何验证器?
答案 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");
}
}
}