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设计模式 Adapter(适配器模式)
Jun 26 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
php实现xml转换数组的方法示例
Feb 03 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
Laravel框架下载,安装及路由操作图文详解
Dec 04 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
YII2框架使用控制台命令的方法分析
Mar 18 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设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
filemanage功能中用到的lib.js
2007/04/08 Javascript
Javascript的匿名函数小结
2009/12/31 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
JavaScript脚本判断蜘蛛来源的方法
2015/09/22 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
深入理解vue $refs的基本用法
2017/07/13 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
2019/11/13 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
vue $mount 和 el的区别说明
2020/09/11 Javascript
python类和函数中使用静态变量的方法
2015/05/09 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
python 调试冷知识(小结)
2019/11/11 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
数学教学随笔感言
2014/02/17 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
年检委托书
2014/08/30 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
银行求职信模板
2015/03/20 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript