Lumen(laravel) 验证器

参考文档

  • 官方文档
  • laravel学院文档

用法

在控制器中使用

直接调用

Lumen 的控制器基类使用 ProvidesConvenienceMethods trait,因此可以直接在控制器中调用validate方法
public function validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
validate方法接收四个入参

  • $request Request请求类 \Illuminate\Http\Request

  • $rules 验证规则 数组 [‘参数’=>’规则’] ['id' => 'required'],多个规则使用|分隔,例如:['id' => 'required|integer']

  • $messages 可选参数 自定义错误信息 数组 [‘参数.规则’=>‘提示语句’] ,错误信息中可以使用:attribute占位符来替换实际的字段名,同时还有其他占位符可以使用,具体参考官方文档['id.required'=>':attribute不能为空'],返回的错误信息为 id不能为空,多个规则需要定义多个提示语句,例如['id.required'=>':attribute不能为空','id. integer'=>':attribute不是一个有效的整数']

  • $customAttributes 可选参数 定义字段别名用于替换错误信息中的:attribute 数组 [‘参数’=> ’别名‘],例如 ['id'=>'ids'] 返回的required错误信息则就是 ids不能为空 [1]参考链接

示例:

public function test()
{
        $result = app('request');
        $this->validate($result, [
            'id' => 'required|integer'
        ], [
            'id.required' => ':attribute不能为空',
            'id.integer' => ':attribute不是一个有效的整数'
        ], [
            'id' => 'ids'
        ]);

        //验证通过...
);
封装成对象调用(可灵活根据自己需求调整封装)

目前提供两种思路

  1. 一个类负责少量的字段验证,验证时通过多个验证类组合起来验证,优势是验证解耦,一样字段只需要定义一次。劣势是字段过于细化,不便于管理,对于要一次验证大量字段时需要传入验证类过多。
  2. 一个类负责大量的字段验证,验证时传入一个参数,根据参数选择需要验证的数组。优势是一个类可以对增删改查所需要验证的字段都写在一起,便于管理。劣势是耦合高,无法再其他地方复用。

当然两种思路也可以一起用,根据需求灵活选择

创建自定义基类 BaseValidate
定义rules 、messages、custom 方法,返回空数组,静态还是非静态都可以,本文中均使用静态形式。

    protected static function rules(){
        return [];
    }
    protected static function messages(){
        return [];
    }
    protected static function custom(){
        return [];
    }

定义校验方法

    /**
     * 验证来自request的数据
     * @param mixed ...$classList 其他验证类
     * @return array
     * @throws \Exception
     */
    public static function check(...$classList)
    {
        $data = app('request')->all();
        $classArray = [];
        self::getClassList($classList, $classArray);
        if (count($classArray) > 0) {
            foreach ($classArray as $class) {
                $class::checkData($data);
            }
        }
        self::validator($data);
        return $data;
    }

     /**
     * 验证指定数据
     * @param array $data 指定验证数据
     * @param array ...$classList 其他验证类
     * @return array
     * @throws \Exception
     */
    public static function checkData($data, ...$classList)
    {
        $classArray = [];
        self::getClassList($classList, $classArray);
        if (count($classArray) > 0) {
            foreach ($classArray as $class) {
                $class::checkData($data);
            }
        }
        self::validator($data);
        return $data;
    }

    //执行验证
    private static function validator($data)
    {
        $validator = Validator::make($data, static::rule(),static:: messages(),static:: custom());
        if ($validator->fails()) {
                //返回所有错误
            $errors = $validator->errors();
            //返回其中一个错误
            throw new \Exception($errors->first());
            //...根据需要在此处抛出异常或返回给上一层处理
        }
    }

    //递归遍历获取所有验证类
    private static function getClassList($classList, &$classArray)
    {
        foreach ($classList as $item) {
            if (is_array($item)) {
                self::getClassList($item, $classArray);
                continue;
            }
            $classArray[] = $item;
        }
    }

定义子类IdValidate 继承自定义基类,复写rules 、messages、custom 方法,messages和custom非必需

class IdValidate extends BaseValidate
{

    public static function rule()
    {
        return [
            'id' => 'required|integer',
        ];
    }

    public static function messages()
    {
        return [
            'id.required' => ':attribute不能为空',
            'id.integer' => ':attribute不是一个有效的整数'
        ];
    }

    public static function custom()
    {
        return [
            'id' => 'ids'
        ];
    }

}

在控制器中调用

public function test()
{
        $data = IdValidate::check()

        //验证通过...
);

多个验证类组合调用


public function test()
{
         //...省略tokenVlidate 和 nameValidate的定义,和IdValidate一样

         //一种调用格式
        $data = IdValidate::check(tokenVlidate::class, nameValidate::class);

        //另一种调用格式
        $validateClass =[tokenVlidate::class, nameValidate::class];
        $data = IdValidate::check($validateClass);

        //验证通过...
);

在模型中使用

自定义一个model基类 BaseModel,复写save方法。


    protected function rules()
    {
        return [];
    }

    protected function messages()
    {
        return [];
    }

    protected function custom()
    {
        return [];
    }

    public function save(array $options = [])
    {
        $data = $this->getAttributes();
        $validator = Validator::make($data, $this->rules(), $this->messages(), $this->custom());
        if ($validator->fails()) {
            $errors = $validator->errors();
            throw new \Exception($errors->first());
        }
        return parent::save($options); // TODO: Change the autogenerated stub
    }

在model中定义rules、messages、custom

class Test extends BaseModel
{
    protected $table = 'test';

    public function rules()
    {
        return [
            'id' => 'required|integer',
        ];
    }

    public function messages()
    {
        return [
            'id.required' => ':attribute不能为空',
            'ids.integer' => ':attribute不是一个有效的整数'
        ];
    }

    public function custom()
    {
        return [
            'id' => 'ids'
        ];
    }

}

这样在执行save方法时就会对model里定义的规则进行校验,同理其他方法也是一样可以重写加规则验证。

你可能感兴趣的:(PHP,laravel,lumen)