我是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