yii2 在控制器中验证请求参数的使用方法
写api接口时一般会在控制器中简单验证参数的正确性。
使用yii只带验证器(因为比较熟悉)实现有两种方式(效果都不佳)。
针对每个请求单独写个 Model,定义验证规则并进行验证。缺点:写好多参数验证的 Model类。
使用 独立验证器中提到的 $validator->validateValue()方法直接验证变量值。缺点:写实例化很多验证器对象。
有么有“一劳永逸”的做法,像在 Model中通过 rules方法定义验证规则并实现快速验证的呢?有!
使用方法(实现效果)
namespacefrontend\controllers\api;
useyii\web\Controller;
usecommon\services\app\ParamsValidateService;
classArticleControllerextendsController
{
//文章列表
publicfunctionactionList()
{
$PVS=newParamsValidateService();
$valid=$PVS->validate(\Yii::$app->request->get(),[
['category_id','required'],
['category_id','integer'],
['keyword','string'],
]);
if(!$valid){
$this->apiError(1001,$PVS->getErrorSummary(true));
}
//...
}
//新增文章
publicfunctionactionPost()
{
$PVS=newParamsValidateService();
$valid=$PVS->validate(\Yii::$app->request->get(),[
[['category_id','title','content'],'required'],
['category_id','integer'],
[['title'],'string','max'=>64],
[['content'],'string'],
]);
if(!$valid){
$this->apiError(1001,$PVS->getErrorSummary(true));
}
//...
}
//文章删除
publicfunctionactionDelete()
{
$PVS=newParamsValidateService();
$valid=$PVS->validate(\Yii::$app->request->get(),[
['article_id','required'],
['article_id','integer'],
]);
if(!$valid){
$this->apiError(1001,$PVS->getErrorSummary(true));
}
//...
}
}
实现方法
定义参数验证模型
定义参数验证模型 ParamsValidateModel,继承 yii\db\ActiveRecord,重写 attributes()方法,主要功能:
- 验证规则可从对象外部进行设置。
- 从验证规则中获取可赋值的属性。
_rules=$rules;
foreach($rulesas$item){
$this->_attributes=array_unique(array_merge($this->_attributes,(array)$item[0]));
}
}
//重写获取验证规则
publicfunctionrules()
{
return$this->_rules;
}
//设置可用属性列表
publicfunctionattributes()
{
return$this->_attributes;
}
}
定义参数验证服务类
定义参数验证服务类,主要功能有:
- 设置参数列表和参数规则列表。
- 使用 参数验证模型进行验证和存储验证错误消息。
- 使用魔术方法获取 参数验证模型中的验证错误消息。
model=newParamsValidateModel();
}
/**
*@paramarray$data数据项
*@paramarray$rules验证规则
*@returnbool
*/
publicfunctionvalidate($data,$rules)
{
//添加验证规则
$this->model->setRules($rules);
//设置参数
$this->model->load($data,'');
//进行验证
return$this->model->validate();
}
publicfunction__call($name,$params)
{
if($this->model->hasMethod($name)){
returncall_user_func_array([$this->model,$name],$params);
}else{
returnparent::__call($name,$params);
}
}
}
总结
以上所述是小编给大家介绍的yii2在控制器中验证请求参数的使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。