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权限分配的实现代码
Apr 28 PHP
浅谈discuz密码加密的方式
May 22 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
php中运用http调用的GET和POST方法示例
Sep 29 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
Yii使用技巧大汇总
Dec 29 PHP
php无限级分类实现方法分析
Oct 19 PHP
php版微信自定义回复功能示例
Dec 05 PHP
php mysql实现mysql_select_db选择数据库
Dec 30 PHP
PHP如何获取当前主机、域名、网址、路径、端口等参数
Jun 09 PHP
详解PHP设计模式之依赖注入模式
May 25 PHP
浅谈如何提高PHP代码的质量
May 28 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
终于听上了直流胆调频
2021/03/02 无线电
德生PL330的评价与改造
2021/03/02 无线电
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
Python 除法小技巧
2008/09/06 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
详解Python的Django框架中的模版相关知识
2015/07/15 Python
python numpy 按行归一化的实例
2019/01/21 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
Python ATM功能实现代码实例
2020/03/19 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
OpenCV读取与写入图片的实现
2020/10/13 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
美国婴儿用品店:Babies”R”Us
2017/10/12 全球购物
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
健康教育评估方案
2014/05/25 职场文书
工地安全质量标语
2014/06/07 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
高中英语教学反思范文
2016/03/02 职场文书