一個沒有技術含量的 validation 驗證層輪子

LastOrder發表於2019-06-10

給大家分享一個輪子 form-request-validation,無恥求star。 github地址

開發這個輪子的目的是為一些比較老舊的專案,或者一些沒有請求驗證層的專案可以更便捷的進行資料驗證,而不需要用很多的 if 去判斷,而且還能清晰的把一些基本驗證和業務程式碼分離開來,使得程式碼結構更加的清晰,易於維護。

$ composer require slpcode/form-request-validation -vvv

該輪子有兩個比較重要的類 FormRequestValidator,FormRequest主要是用來被繼承的,用於自行搭建一個驗證層,內部預設會對請求的$_GET, $_POST,$_FILES資料進行驗證,如果請求傳遞的資料是json並且請求頭為json請求頭,那麼會對json資料進行驗證。用法和Laravel的表單驗證一樣,因為這個輪子是基於laravel的 illuminate/validation 的。

<?php

use Slpcode\FormRequestValidation\FormRequest;

class TestRequest extends FormRequest
{
    /**
     * 設定驗證規則.
     *
     * @return array
     */
    protected function rules()
    {
        return [
            'name' => 'required|max:20',
            'age' => 'required|min:6',
        ];
    }

    /**
     * 設定驗證錯誤資訊.
     *
     * @return array
     */
    protected function messages()
    {
        return [
            'name.required' => '名字不能為空',
            'name.max' => '名字不能超過20位'
        ];
    }

    /**
     * 自定義欄位名稱.
     *
     * @return array
     */
    protected function attributes()
    {
        return [];
    }
}
<?php 

// 進行驗證,如果驗證不通過則會丟擲 Slpcode\FormRequestValidation\Exceptions\ValidationException 異常
// 通過後返回request例項
(new TestRequest)->check();

也可以使用validator物件直接操作驗證,這種方法是單純的進行資料驗證,需要自己傳遞要驗證的資料到該Validator例項的make方法

<?php

// 直接建立驗證器物件的用法
$validator = \Slpcode\FormRequestValidation\Validator::getInstance();

//驗證
$rules = [
    'name' => 'required|min:5|max:20',
    'age' => 'required|max:2',
    ///...
];
$data = [
    ///...
];
// 可選
// 自定義錯誤訊息
$messages = [

    'name.required' => '名稱不能為空',
    //...
]; 
// 可選
// 自定義屬性名稱
$attributes = [
    'name' => '使用者名稱',
    'age' => '年齡',
];
$validatorObj = $validator->make($data, $rules, $messages, $attributes);
//判斷驗證是否通過
if ($validatorObj->fails()) {
   //未通過
   //輸出錯誤訊息
   dd($validatorObj->messages()->all());
} else {

}
FormRequest擴充套件驗證

預設帶的驗證方式也許不能滿足我們業務的需求,所以需要擴充套件驗證,我們可以自己建立一個驗證基類,例如:BaseRequest,然後繼承
\Slpcode\FormRequestValidation\FormRequest,然後我們其它的驗證類再繼承這個BaseRequest即可。

<?php
class BaseRequest extends \Slpcode\FormRequestValidation\FormRequest
{
    public function extend()
    {
        $this->getValidator()->extend('mobile', function ($attribute, $value, $parameters, $validator) {
            return preg_match("/^1[3,4,5,6,7,8,9]{1}[0-9]{9}$/", $value);
        }, ':attribute 格式不正確');
    }
}

// 使用擴充套件的mobile
class TestRequest extends BaseRequest
{
    /**
     * 設定驗證規則.
     *
     * @return array
     */
    protected function rules()
    {
        return [
            'phone' => 'required|mobile',
        ];
    }
}
Validator擴充套件驗證
$validator = \Slpcode\FormRequestValidation\Validator::getInstance();
$validator->extend(
    'mobile', 
    function ($attribute, $value, $parameters, $validator) {
         return preg_match("/^1[3,4,5,6,7,8,9]{1}[0-9]{9}$/", $value);
    },
    ':attribute 格式不正確'
);

預設內建了英文(en)和中文(zh-CN)兩種語言包 語言列表可以從這裡拿 https://github.com/caouecs/Laravel-lang

FormRequest語言包設定
<?php
class BaseRequest extends \Slpcode\FormRequestValidation\FormRequest
{
    protected $translation_path = __DIR__ . '/lang';
    protected $translation_locale = 'en';
}

// 或
(new TestRequest)->setLang('en', '語言包路徑');
Validator語言包設定
<?php
// 內部有兩種語言包 en 和 zh-CN
$validator = \Slpcode\FormRequestValidation\Validator::getInstance('en', '語言包路徑');

如果需要完全無依賴版本,推薦overtrue大神的 https://github.com/overtrue/validation

相關文章