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 相关文章推荐
汉字转化为拼音(php版)
Oct 09 PHP
php include的妙用,实现路径加密
Jul 29 PHP
PHP开发规范手册之PHP代码规范详解
Jan 13 PHP
php 大数据量及海量数据处理算法总结
May 07 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
thinkphp分页实现效果
Oct 13 PHP
PHP结合Ueditor并修改图片上传路径
Oct 16 PHP
PHP开发的微信现金红包功能示例
Jun 29 PHP
PHP receiveMail实现收邮件功能
Apr 25 PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 PHP
PHP常用函数之获取汉字首字母功能示例
Oct 21 PHP
PHP code 验证码生成类定义和简单使用示例
May 27 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP 七大优势分析
2009/06/23 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
解析wamp5下虚拟机配置文档
2013/06/27 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
php结合正则获取字符串中数字
2015/06/19 PHP
老生常谈文本文件和二进制文件的区别
2017/02/27 PHP
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
用python实现简单EXCEL数据统计的实例
2017/01/24 Python
python链接oracle数据库以及数据库的增删改查实例
2018/01/30 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
应届生船舶驾驶求职信
2013/10/19 职场文书
分家协议书
2014/04/21 职场文书
党支部换届选举方案
2014/05/08 职场文书
售房协议书
2014/08/19 职场文书
农村党员对照检查材料
2014/09/24 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
Java使用Unsafe类的示例详解
2021/09/25 Java/Android