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 相关文章推荐
PHP file_get_contents设置超时处理方法
Sep 30 PHP
php实现的百度搜索某地天气的小偷代码
Apr 23 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 PHP
php操作MongoDB类实例
Jun 17 PHP
PHP模板解析类实例
Jul 09 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
Jul 29 PHP
Yii2针对指定url的生成及图片等的引入方法小结
Jul 18 PHP
利用PHP将图片转换成base64编码的实现方法
Sep 13 PHP
php高清晰度无损图片压缩功能的实现代码
Dec 09 PHP
PHP 文件上传限制问题
Sep 01 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
PHP实现登录注册之BootStrap表单功能
2017/09/03 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
jQuery实现跨域
2015/02/03 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
Javascript的表单与验证-非空验证
2016/03/18 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
webpack+react+antd脚手架优化的方法
2018/04/02 Javascript
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
JS实现Cookie读、写、删除操作工具类示例
2018/08/28 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
python写的一个squid访问日志分析的小程序
2014/09/17 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
实例讲解Python爬取网页数据
2018/07/08 Python
python 反向输出字符串的方法
2018/07/16 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
python函数不定长参数使用方法解析
2019/12/14 Python
python Paramiko使用示例
2020/09/21 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
浅析python字符串前加r、f、u、l 的区别
2021/01/24 Python
化学教师教学反思
2014/01/17 职场文书
社区健康教育实施方案
2014/03/18 职场文书
餐饮投资计划书
2014/04/25 职场文书