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 相关文章推荐
生成sessionid和随机密码的例子
Oct 09 PHP
PHP学习笔记之二
Jan 17 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
Feb 19 PHP
PHP gbk环境下json_dencode传送来的汉字
Nov 13 PHP
php中current、next与reset函数用法实例
Nov 17 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
分享php邮件管理器源码
Jan 06 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
解决laravel id非自增 模型取回为0 的问题
Oct 11 PHP
php post换行的方法
Feb 03 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
php读取mysql中文数据出现乱码的解决方法
2013/08/16 PHP
php+js实现异步图片上传实例分享
2014/06/02 PHP
joomla组件开发入门教程
2016/05/04 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
通过正则格式化url查询字符串实现代码
2012/12/28 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
详解使用vuex进行菜单管理
2017/12/21 Javascript
vue2.0使用swiper组件实现轮播的示例代码
2018/03/03 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
2019/01/27 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
python的即时标记项目练习笔记
2014/09/18 Python
Python二维码生成库qrcode安装和使用示例
2014/12/16 Python
python获取本机mac地址和ip地址的方法
2015/04/29 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
担保书怎么写
2014/04/01 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
民主评议党员工作总结
2014/10/20 职场文书
搞笑婚前保证书
2015/02/28 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
Python中的嵌套循环详情
2022/03/23 Python