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 相关文章推荐
多重?l件?合查?(一)
Oct 09 PHP
同一空间绑定多个域名而实现访问不同页面的PHP代码
Dec 06 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
Jan 26 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
php自动给网址加上链接的方法
Jun 02 PHP
WordPress中注册菜单与调用菜单的方法详解
Dec 18 PHP
PHP会话操作之cookie用法分析
Sep 28 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
PHP获取页面执行时间的方法(推荐)
Dec 10 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
PHP终止脚本运行三种实现方法详解
Sep 01 PHP
详解PHP Swoole与TCP三次握手
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
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
JQuery live函数
2010/12/24 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
javascript解析json实例详解
2014/11/05 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
jQuery基础知识点总结(DOM操作)
2016/06/01 Javascript
Bootstrap Table使用方法解析
2016/10/19 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
Vue 第三方字体图标引入 Font Awesome的方法
2018/09/28 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python入门前的第一课 python怎样入门
2018/03/06 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
Python微信操控itchat的方法
2019/05/31 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
python raise的基本使用
2020/09/10 Python
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
瑞典度假品牌:OAS
2019/05/28 全球购物
新加坡第一的杂货零售商:NTUC FairPrice
2020/12/05 全球购物
消防应急演练方案
2014/02/12 职场文书
美容院店长岗位职责
2014/04/08 职场文书
婚纱店策划方案
2014/05/22 职场文书
校园环保标语
2014/06/13 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
东京审判观后感
2015/06/01 职场文书