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 3行代码的分页算法(求起始页和结束页)
Oct 21 PHP
通过table标签,PHP输出EXCEL的实现方法
Jul 24 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
php 伪静态之IIS篇
Jun 02 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
php绘图之加载外部图片的方法
Jan 24 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
php实现留言板功能
Mar 05 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
Sep 13 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
laravel框架 api自定义全局异常处理方法
Oct 11 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教程之phpize使用方法
2014/02/12 PHP
PHP中$this和$that指针使用实例
2015/01/06 PHP
php定时执行任务设置详解
2015/02/06 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
Vue header组件开发详解
2018/01/26 Javascript
JS对象和字符串之间互换操作实例分析
2019/02/02 Javascript
详解使用React制作一个模态框
2019/03/14 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
一个超级简单的python web程序
2014/09/11 Python
Python itertools模块详解
2015/05/09 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
Python断言assert的用法代码解析
2018/02/03 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
django和flask哪个值得研究学习
2020/07/31 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
美国网上订购鲜花:FTD
2016/09/23 全球购物
俄罗斯小米家用电器、电子产品和智能家居商店:Poood.ru
2020/04/03 全球购物
会计学个人自荐信模板
2013/12/13 职场文书
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
导游词之阆中古城
2019/12/23 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers