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

吾爱主题 阅读:113 2021-09-24 14:11:00 评论:0

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

定义验证器基类

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <?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 ;    }      //自定义验证规则   }

定义验证器

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?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 方法,实例化验证器,并进行场景验证。

?
1 2 3 4 5 6 7 public function register(Request $request ){    $validator = new UserValidator();    $validator ->checkParams( 'register' );    .    .    .

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://learnku.com/articles/38289

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容