ThinkPHP类似AOP思想的参数验证的实现方法


Posted in PHP onDecember 18, 2019

思路讲解:不管是在开发 API 还是做后台项目的时候,后端永远不要相信前端传输的参数,通常要做的是验证参数的合法性和安全性。那么在实际项目开发的时候,怎么简便的验证参数呢。TP 提供了好几种参数验证的方式,比如验证器,独立验证,又或者在继承 Controller 基类的情况下使用 validate 方法。相比而言,验证器还是最佳选择。一个控制器有多个方法,也就表示有多个请求,也就表示有多个场景。一个项目不止一个控制器,那就表示不止需要建立一个验证器。面向对象的思想,就需要我们建立一个基类验证器,然后让子类继承就行了。那么怎么实现参数验证呢,下面我就介绍下类似 AOP 思想的参数验证的实现。

定义验证器基类

定义基类 app\common\validator\BaseValidator.php

<?php

namespace app\common\validator;

use app\common\exception\ParamException;
use think\Validate;

class BaseValidator extends Validate
{
  /**
   * @param string $scene
   * @return bool
   * @throws ParamException
   */
  public function checkParams($scene='')
  {
    $params = input('param.');
    $res = $this->scene($scene)->check($params);

    if( ! $res ){
      $error = $this->error;
      if(is_array($error)){
        $error = implode(',',$error);
      }
      throw new ParamException(['errMsg'=>$error,]);
    }
    return $res;
  }

  //自定义验证规则

}

定义验证器

<?php

namespace app\common\validator\user;

use app\common\validator\BaseValidator;

class UserValidator extends BaseValidator
{
  protected $rule =  [
    'name' => 'require|max:25',
    'age'  => 'number|between:1,120',
    'email' => 'email',
  ];

  protected $message =  [
    'name.require' => '名称必须',
    'name.max'   => '名称最多不能超过25个字符',
    'age.number'  => '年龄必须是数字',
    'age.between' => '年龄只能在1-120之间',
    'email'    => '邮箱格式错误',
  ];

  protected $scene = [
    'register' => ['name','email'],
  ];
}

验证参数

User.php 控制器 register 方法,实例化验证器,并进行场景验证。

public function register(Request $request){
    $validator = new UserValidator();
    $validator->checkParams('register');
    .
    .
    .
  }

至此,类似于 AOP 思想的参数验证就完成了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
建立文件交换功能的脚本(一)
Oct 09 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
PHP实现返回JSON和XML的类分享
Jan 28 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
Dec 11 PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 PHP
CodeIgniter针对数据库的连接、配置及使用方法
Mar 03 PHP
PHP微信开发之查询微信精选文章
Jun 23 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
Jun 07 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 #PHP
PHP中用Trait封装单例模式的实现
Dec 18 #PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 #PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 #PHP
Laravel等框架模型关联的可用性浅析
Dec 15 #PHP
php获取是星期几的的一些常用姿势
Dec 15 #PHP
Yii2框架中一些折磨人的坑
Dec 15 #PHP
You might like
php随机显示图片的简单示例
2014/02/15 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
python 类详解及简单实例
2017/03/24 Python
Python面向对象之继承代码详解
2018/01/29 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
感恩的演讲稿
2014/05/06 职场文书
正确使用MySQL update语句
2021/05/26 MySQL
Python多个MP4合成视频的实现方法
2021/07/16 Python
Oracle 触发器trigger使用案例
2022/02/24 Oracle