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 相关文章推荐
数据库相关问题
Oct 09 PHP
PHP 5.0对象模型深度探索之类的静态成员
Mar 27 PHP
php中iconv函数使用方法
May 24 PHP
PHP Ajax中文乱码问题解决方法
Feb 27 PHP
Laravel框架中扩展函数、扩展自定义类的方法
Sep 04 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 PHP
php生成验证码函数
Oct 20 PHP
一波PHP中cURL库的常见用法代码示例
May 06 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
Yii框架中使用PHPExcel的方法分析
Jul 25 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
Sep 10 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
Dec 12 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实现检查文章是否被百度收录
2015/01/27 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
PHP文件操作详解
2016/12/30 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
使用js判断当前时区TimeZone是否是夏令时
2014/02/23 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
js实现单张图片平移切换效果
2017/10/11 Javascript
javascript将非数值转换为数值
2018/09/13 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
Python实现简单http服务器
2018/04/12 Python
Python中作用域的深入讲解
2018/12/10 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
Python银行系统实战源码
2019/10/25 Python
详解Django admin高级用法
2019/11/06 Python
Python中的__init__作用是什么
2020/06/09 Python
python爬取音频下载的示例代码
2020/10/19 Python
电焊工工作岗位职责
2014/02/06 职场文书
罚站检讨书
2015/01/29 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
写给医护人员的一封感谢信
2019/09/16 职场文书
对讲机的最大通讯距离是多少
2022/02/18 无线电
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers