道者编程

Laravel的Validator验证

初步使用了一下Validator,感觉很强大,也很方便,梳理一下流程。

我个人习惯把验证写在模型里面,这样控制器看起来更简洁,当然写在控制器也可以,写在中间件也行。也可以用Laravel自带的创建Validator表单请求验证类。

分别记录一下在模型创建表单请求两种Validator实现方法,不建议写在控制器,控制器应该保持简洁。

一:第一种使用方法,模型中使用Validator:

1:建立一个模型,加入4个方法

//验证规则
    protected $role = [
        'passwordOld' => 'required|min:6|max:12', 
        'passwordNew' => 'required|min:6|max:12|confirmed',
        'passwordNew_confirmation' => 'required|min:6|max:12',
    ]; //这三个字段为提交表单的input

    //提示信息 attribute是占位符,这里是custom方法的value
    protected $msgs = [
        'required' => ':attribute不能为空',
        'min' => ':attribute最少:min字符',
        'max' => ':attribute最长:max字符'
        'confirmed' => ':attribute输入不一致'
    ];

    // 自定义字段名称,提示的时候用到
    protected $custom = [
        'passwordOld' => '原密码',
        'passwordNew' => '新密码',
        'passwordNew_confirmation' => '密码确认',
    ];

    //设置密码 $input提交过来的表单和数据
    public function setPassword($input)
    {
        $validator = \Validator::make($input,$this->role,$this->msgs,$this->custom);
        if($validator->fails()){//验证字段失败,失败信息自己封装处理
            $validator->errors()->first(); //返回第一个错误消息,一般用这个就行了
            //$validator->errors()->all(); //返回全部错误消息,不带表单下标
            //$validator->errors(); //返回全部错误消息,带表单下标
        }
    }

小提示:confirmed参数是判断两个字段是否一致。后一个字段必须带confirmation;比如这里密码字段是:passwordNew,那么确认密码字段就是:passwordNew_confirmation。

 'passwordNew' => 'required|min:6|max:12|confirmed',
 'passwordNew_confirmation' => 'required|min:6|max:12',

相应的表单里面就是:

 input type="password" name="passwordNew_confirmation
 

这样Laravel才能正确判断两个字段输入是否一致。

还有个神奇的功能:

'passwordOld' => 'required|min:6|max:12|exists:admin,password,id,4', 
这里的exists:admin,password,id,4 会匹配数据库,这段换成SQL语句:

select count(*) as aggregate from `js_admin` where `passsword` = 密码 and `id` = 4

2:控制器调用:

public function password(request $re)
{
	$input = $re->except('_token');//接受POST表单过来的数据,除开_token
       	$set = new Admin; //我这里的模型是Admin
       	$set->setPassword($input); //验证
}


二:第二种使用方法,创建Validator表单请求,Laravel推荐的方式

1:运行:

php artisan make:request name
 这样就在app\Http\Requests 创建了一个name.php的文件,可以在里面写验证,写法和下面模型中的基本上一样,然后控制器里面use命名空间加载调用。

打开看一下:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class name extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

原始文件是上面这样的,我们修改一下添加一些规则,看起来是下面这样的。

方法全部来源于:vendor\laravel\framework\src\Illuminate\Foundation\Http\FormRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class PasswordRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; //这个方法可以用来控制访问权限,一般用不上,这里改成true
    }

    /**
     * Get the validation rules that apply to the request.
     * 获取应用于请求的验证规则
     * @return array
     */
    public function rules()
    {
        return [
            'passwordOld' => 'required|min:6|max:12', 
            'passwordNew' => 'required|min:6|max:12|confirmed',
            'passwordNew_confirmation' => 'required|min:6|max:12'
        ];
    }

    //自定义字段名称,提示的时候中文,如果没有这个,提示的就是input的name
    function attributes()
    {
        return [
            'passwordOld' => '原密码',
            'passwordNew' => '新密码',
            'passwordNew_confirmation' => '密码确认',
        ];
    }
    //验证器错误的自定义消息
    public function messages()
    {
        return [
            'required' => ':attribute不能为空',
            'min' => ':attribute最少:min字符',
            'max' => ':attribute最长:max字符',
            'confirmed' =>':attribute输入不一致',
            'exists' => ':attribute输入不正确'
        ];
    }

   //处理失败的验证尝试,返回处理失败信息,
   //我们可以返回给控制器错误信息,或者Ajax,除此之外我们不需要加下面这个方法。
   public function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
   {
     echo json_encode(array(
            'success' => false,
            'message' => 'There are incorect values in the form!',
            'errors' => $validator->getMessageBag()->toArray()
        ));
   }
    
}
 

2:控制器调用

//我们一般都这样用:request $re,现在改成这样,Laravel会自动调用name.php实现验证
public function setpassword(\App\Http\Requests\name $re)
{
		
}
3:视图渲染提示信息

@if ($errors->any())
{{ $errors->first() }} //显示第一条出错信息
@endif

如果验证失败,Validator会重定向到页面,并输出错误信息。或者返回指定字段信息

{{ $errors->first('title') }}


三:Validator验证规则(以下转自Laravel学院)

accepted

验证字段的值必须是 yeson1 或 true,这在“同意服务协议”时很有用。

active_url

验证字段必须是基于 PHP 函数 dns_get_record 的,有 A 或 AAAA 记录的值。

after:date

验证字段必须是给定日期之后的一个值,日期将会通过 PHP 函数 strtotime 传递:

'start_date' => 'required|date|after:tomorrow'

你可以指定另外一个与日期进行比较的字段,而不是传递一个日期字符串给 strtotime 执行:

'finish_date' => 'required|date|after:start_date'

after_or_equal:date

验证字段必须是大于等于给定日期的值,更多信息,请参考 after:date 规则。

alpha

验证字段必须是字母。

alpha_dash

验证字段可以包含字母和数字,以及破折号和下划线。

alpha_num

验证字段必须是字母或数字。

array

验证字段必须是 PHP 数组。

before:date

和 after:date 相对,验证字段必须是指定日期之前的一个数值,日期将会传递给 PHP strtotime 函数。

before_or_equal:date

验证字段必须小于等于给定日期。日期将会传递给 PHP 的 strtotime 函数。

between:min,max

验证字段大小在给定的最小值和最大值之间,字符串、数字、数组和文件都可以像使用 size 规则一样使用该规则:

'name' => 'required|between:1,20'

boolean

验证字段必须可以被转化为布尔值,接收 truefalse10"1" 和 "0" 等输入。

confirmed

验证字段必须有一个匹配字段 foo_confirmation,例如,如果验证字段是 password,必须输入一个与之匹配的 password_confirmation 字段。

date

验证字段必须是一个基于 PHP strtotime 函数的有效日期

date_equals:date

验证字段必须等于给定日期,日期会被传递到 PHP strtotime 函数。

date_format:format

验证字段必须匹配指定格式,可以使用 PHP 函数date 或 date_format 验证该字段。

different:field

验证字段必须是一个和指定字段不同的值。

digits:value

验证字段必须是数字且长度为 value 指定的值。

digits_between:min,max

验证字段数值长度必须介于最小值和最大值之间。

dimensions

验证的图片尺寸必须满足该规定参数指定的约束条件:

'avatar' => 'dimensions:min_width=100,min_height=200'

有效的约束条件包括:min_widthmax_widthmin_heightmax_heightwidthheightratio

ratio 约束宽度/高度的比率,这可以通过表达式 3/2 或浮点数 1.5 来表示:

'avatar' => 'dimensions:ratio=3/2'

由于该规则要求多个参数,可以使用 Rule::dimensions 方法来构造该规则:

use Illuminate\Validation\Rule;

Validator::make($data, [
    'avatar' => [
        'required',
        Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2),
    ],
]);

distinct

处理数组时,验证字段不能包含重复值:

'foo.*.id' => 'distinct'

email

验证字段必须是格式正确的电子邮件地址

exists:table,column

验证字段必须存在于指定数据表

基本使用:

'state' => 'exists:states'

指定自定义列名:

'state' => 'exists:states,abbreviation'

有时,你可能需要为 exists 查询指定要使用的数据库连接,这可以在表名前通过.前置数据库连接来实现:

'email' => 'exists:connection.staff,email'

如果你想要自定义验证规则执行的查询,可以使用 Rule 类来定义规则。在这个例子中,我们还以数组形式指定了验证规则,而不是使用 | 字符来限定它们:

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::exists('staff')->where(function ($query) {
            $query->where('account_id', 1);
        }),
    ],
]);

file

验证字段必须是上传成功的文件。

filled

验证字段如果存在则不能为空。

image

验证文件必须是图片(jpeg、png、bmp、gif 或者 svg)


最新评论:
1楼 上海市 电信 发表于 2018-06-21 14:31:53
111
2楼 北京市 电信通 发表于 2019-08-23 15:34:03
like
3楼 辽宁省阜新市 电信 发表于 2019-09-11 11:39:29
烦烦烦
4楼 北京市 联通ADSL 发表于 2020-05-28 12:38:27
源码是如何实现的?
共有 4 条记录  首页 上一页 下一页 尾页 1
我要评论:

看不清楚