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 单引号与双引号的区别
Nov 24 PHP
PHP按行读取、处理较大CSV文件的代码实例
Apr 09 PHP
PHP中实现crontab代码分享
Mar 26 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
Dec 14 PHP
PHP共享内存用法实例分析
Feb 12 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
PHP之图片上传类实例代码(加了缩略图)
Jun 30 PHP
php+Memcached实现简单留言板功能示例
Feb 15 PHP
利用PHPStorm如何开发Laravel应用详解
Aug 30 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
Apr 27 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 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和ACCESS写聊天室(二)
2006/10/09 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
PHP中文件缓存转内存缓存的方法
2011/12/06 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
php mongodb操作类 带几个简单的例子
2016/08/25 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
PHP如何开启Opcache功能提升程序处理效率
2020/04/27 PHP
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
vue.extend实现alert模态框弹窗组件
2018/04/28 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
js实现动态时钟
2020/03/12 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
浅析python实现scrapy定时执行爬虫
2018/03/04 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
TensorFlow实现Logistic回归
2018/09/07 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
Unix/Linux开发面试题
2016/08/16 面试题
争先创优公开承诺书
2014/08/30 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
化验室岗位职责
2015/02/14 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
党员干部学习心得体会
2016/01/23 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python