yii2 在控制器中验证请求参数的使用方法(yii2 在控制器中验证请求参数的使用方法)
类别:编程学习 浏览量:1477
时间:2022-03-29 10:23:22 yii2 在控制器中验证请求参数的使用方法
yii2 在控制器中验证请求参数的使用方法写api接口时一般会在控制器中简单验证参数的正确性。
使用yii只带验证器(因为比较熟悉)实现有两种方式(效果都不佳)。
针对每个请求单独写个 Model , 定义验证规则并进行验证。 缺点:写好多参数验证的 Model 类。
使用 独立验证器 中提到的 $validator->validateValue()
方法直接验证变量值。缺点:写实例化很多验证器对象。
有么有“一劳永逸”的做法,像在 Model 中通过 rules 方法定义验证规则并实现快速验证的呢?有!
使用方法(实现效果)
|
namespace frontend\controllers\api; use yii\web\Controller; use common\services\app\ParamsValidateService; class ArticleController extends Controller { // 文章列表 public function actionList() { $PVS = new ParamsValidateService(); $valid = $PVS ->validate(\Yii:: $app ->request->get(), [ [ 'category_id' , 'required' ], [ 'category_id' , 'integer' ], [ 'keyword' , 'string' ], ]); if (! $valid ) { $this ->apiError(1001, $PVS ->getErrorSummary(true)); } //... } // 新增文章 public function actionPost() { $PVS = new ParamsValidateService(); $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)); } //... } // 文章删除 public function actionDelete() { $PVS = new ParamsValidateService(); $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()
方法,主要功能:
- 验证规则可从对象外部进行设置。
- 从验证规则中获取可赋值的属性。
|
<?php namespace common\models\app; use yii\db\ActiveRecord; class ParamsValidateModel extends ActiveRecord { /** * @var array 验证规则 */ private $_rules = []; private $_attributes = []; // 设置验证规则 public function setRules( $rules ) { $this ->_rules = $rules ; foreach ( $rules as $item ) { $this ->_attributes = array_unique ( array_merge ( $this ->_attributes, ( array ) $item [0])); } } // 重写获取验证规则 public function rules() { return $this ->_rules; } // 设置可用属性列表 public function attributes() { return $this ->_attributes; } } |
定义参数验证服务类
定义参数验证服务类,主要功能有:
- 设置参数列表和参数规则列表。
- 使用 参数验证模型 进行验证和存储验证错误消息。
- 使用魔术方法获取 参数验证模型 中的验证错误消息。
|
<?php namespace common\services\app; use common\models\app\ParamsValidateModel; use yii\base\Component; /** * Class ParamsValidateService * @package common\services\app * @method array getErrors(\string $attribute) * @method array getFirstErrors() * @method array getFirstError(\string $attribute) * @method array getErrorSummary(\boolean $showAllErrors) */ class ParamsValidateService extends Component { /** * @var ParamsValidateModel 模型 */ private $model = null; public function init() { parent::init(); $this ->model = new ParamsValidateModel(); } /** * @param array $data 数据项 * @param array $rules 验证规则 * @return bool */ public function validate( $data , $rules ) { // 添加验证规则 $this ->model->setRules( $rules ); // 设置参数 $this ->model->load( $data , '' ); // 进行验证 return $this ->model->validate(); } public function __call( $name , $params ) { if ( $this ->model->hasMethod( $name )) { return call_user_func_array([ $this ->model, $name ], $params ); } else { return parent::__call( $name , $params ); } } } |
总结
以上所述是小编给大家介绍的yii2 在控制器中验证请求参数的使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:https://segmentfault.com/a/1190000019513532
您可能感兴趣
- django 获取请求参数(深入理解Django-Signals信号量)
- docker 部署参数配置(Docker搭建Redis5.0并挂载数据)
- python3函数的使用方法(Python3.5基础之函数的定义与使用实例详解参数、作用域、递归、重载等)
- python函数参数讲解(Python高级特性与几种函数的讲解)
- nginxlocation匹配参数(nginx location优先级的深入讲解)
- 方法参数过多的解决方法
- select top 根据传入的参数获取数据的条数
- mybatis 分页查询配置(mybatis-plus分页传入参数后sql where条件没有limit分页信息操作)
- vue3中的setup的参数(Vue3中ref与reactive的详解与扩展)
- mysql的分页原理(mysql分页的limit参数简单示例)
- ASP.NET Web API中参数的传递
- formdata上传图片参数(data:image data url 文件转为Blob上传后端的方法)
- vue3.0带参数的方法(Vue3中ref与toRef的区别浅析)
- ftp服务器安装和配置教学设计思路(FTP服务器的主要参数配置讲解)
- laravel接口响应时间(laravel请求参数校验方法)
- django中filter的参数(详解django2中关于时间处理策略)
- 是不是快乐全被你拿走了(而是你得到的)
- 世界上只有妈妈好(世界上只有妈妈好的歌词)
- 为什么现在社会越来越卷了(现在社会为什么发展那么快呢)
- 直播带货能赚到很多钱吗(直播带货能赚到很多钱吗现在)
- 做网红真的很能赚钱吗(做网红真的很能赚钱吗)
- 10句英语常用(英语常用900句)
热门推荐
- mybatis执行sql源码解析(mybatis调用sqlserver存储过程返回结果集的方法)
- css 宽度继承(CSS样式中大于号的使用及Css中处理继承方法)
- php 设置sessionid生成机制(PHP Cli 模式设置进程名称的方法)
- 配置阿里云docker镜像地址(Docker配置阿里云镜像加速pull的实现)
- css3颜色详解(CSS3混合模式mix-blend-mode/background-blend-mode简介)
- sqlserver新建连接服务器卡住(SQL Server成功与服务器建立连接但是在登录过程中发生错误的快速解决方案)
- python如何使用yield(YII2.0框架行为Behavior深入详解)
- ftp命令详解(FTP 常用命令 使用说明)
- phpstudy创建网站教程交流(phpStudy V8中创建与管理站点图文教程)
- sqlserver表导入数据(在SQLserver数据库之间进行传表和传数据的图文教程)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9