ThinkPHP 類似 AOP 思想的引數驗證

zs4336發表於2019-12-18

ThinkPHP 引數驗證

思路講解:不管是在開發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思想的引數驗證就完成了。

趁還沒掉光,趕緊給每根頭髮起個名字吧~

相關文章