yii2 在控制器中验证请求参数的使用方法


Posted in PHP onJune 19, 2019

写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 在控制器中验证请求参数的使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

PHP 相关文章推荐
Discuz!下Memcache缓存实现方法
May 28 PHP
php递归实现无限分类生成下拉列表的函数
Aug 08 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
php图像处理函数大全(推荐收藏)
Jul 11 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
php实现Linux服务器木马排查及加固功能
Dec 29 PHP
PHP整合PayPal支付
Jun 11 PHP
php无序树实现方法
Jul 28 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
Apr 27 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
Jun 19 #PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 #PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 #PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 #PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 #PHP
PHP进阶学习之反射基本概念与用法分析
Jun 18 #PHP
Laravel使用RabbitMQ的方法示例
Jun 18 #PHP
You might like
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
php创建基本身份认证站点的方法详解
2013/06/08 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP引用返回用法示例
2016/05/28 PHP
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
vue中如何去掉空格的方法实现
2018/11/09 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
Windows下PyMongo下载及安装教程
2015/04/27 Python
Python实现登录接口的示例代码
2017/07/21 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
Shell编程面试题
2016/05/29 面试题
水利学院求职自荐书
2014/02/01 职场文书
寄语学生的话
2014/04/10 职场文书
道歉短信大全
2015/05/12 职场文书
2016年暑期社会实践活动总结报告
2016/04/06 职场文书
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
Nginx内网单机反向代理的实现
2021/11/07 Servers
Mysql数据库group by原理详解
2022/07/07 MySQL