精华内容
下载资源
问答
  • laravel validate验证参数说明

    千次阅读 2020-10-24 19:40:15
    laravel validate验证参数说明 validate的介绍 validate的使用 validate验证参数说明

    validate的介绍

    Laravel提供了几种不同的方法来验证应用程序的传入数据。默认情况下,Laravel的基本控制器类使用ValidatesRequests特征,该特征提供了一种方便的方法,可以使用各种功能强大的验证规则来验证传入的HTTP请求。

    validate的使用

    以下为控制器方法

    简单的表单验证

    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);
    
        // The blog post is valid...
    }
    

    在这个例子里,如果 title字段没有通过 unique,那么不会检查 max 规则。规则会按照分配的顺序来验证。

    关于数组数据的注意事项

    如果你的 HTTP 请求包含一个 「嵌套」 参数(即数组),那你可以在验证规则中通过 「点」 语法来指定这些参数。

    $this->validate($request, [
        'title' => 'required|unique:posts|max:255',
        'author.name' => 'required',
        'author.description' => 'required',
    ]);
    

    validate验证参数说明

    accepted

    验证的字段必须为 yes、 on、 1、或 true。这在确认「服务条款」是否同意时相当有用。

    active_url

    相当于使用了 PHP 函数 dns_get_record,验证的字段必须具有有效的 A 或 AAAA 记录。

    after:date

    验证的字段必须是给定日期后的值。这个日期将会通过 PHP 函数 strtotime 来验证。

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

    你也可以指定其它的字段来比较日期:

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

    after_or_equal:date

    验证的字段必须等于给定日期或之后的值。更多信息请参见 after 规则。

    alpha

    验证的字段必须完全是字母的字符。

    alpha_dash

    验证的字段可能具有字母、数字、破折号( - )以及下划线( _ )。

    alpha_num

    验证的字段必须完全是字母、数字。

    array

    验证的字段必须是一个 PHP 数组。

    before:date

    验证的字段必须是给定日期之前的值。这个日期将会通过 PHP 函数 strtotime 来验证。

    before_or_equal:date

    验证的字段必须等于给定日期或之前的值。这个日期将会使用 PHP 函数 strtotime 来验证。

    between:min,max

    验证的字段的大小必须在给定的 min 和 max 之间。字符串、数字、数组或是文件大小的计算方式都用 size 方法进行评估。

    当需要验证表单数据中数字的大小时,在验证规则中一定要加入 Numeric 或 Integer 其一,size、between、max、min这些验证才会起作用。

    boolean

    验证的字段必须能够被转换为布尔值。可接受的参数为 true、false、1、0、“1” 以及 “0”。

    confirmed

    验证的字段必须和 foo_confirmation 的字段值一致。例如,如果要验证的字段是 password,输入中必须存在匹配的 password_confirmation 字段。

    date

    验证的字段值必须是通过 PHP 函数 strtotime 校验的有效日期。

    date_equals:date

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

    date_format:format

    验证的字段必须与给定的格式相匹配。你应该只使用 date 或 date_format 其中一个用于验证,而不应该同时使用两者。

    different:field

    验证的字段值必须与字段 (field) 的值不同。

    digits:value

    验证的字段必须是数字,并且必须具有确切的值。

    digits_between:min,max

    验证的字段的长度必须在给定的 min 和 max 之间。

    dimensions

    验证的文件必须是图片并且图片比例必须符合规则:

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

    可用的规则为: min_width、 max_width 、 min_height 、 max_height 、 width 、 height 、 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

    验证的字段必须符合 e-mail 地址格式。

    exists:table,column

    验证的字段必须存在于给定的数据库表中。

    Exists 规则的基本使用方法

    '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 )。

    in:foo,bar,…

    验证的字段必须包含在给定的值列表中。因为这个规则通常需要你 implode 一个数组,Rule::in 方法可以用来构造规则:

    use Illuminate\Validation\Rule;
    
    Validator::make($data, [
        'zones' => [
            'required',
            Rule::in(['first-zone', 'second-zone']),
        ],
    ]);
    

    in_array:anotherfield

    验证的字段必须存在于另一个字段(anotherfield)的值中。

    integer

    验证的字段必须是整数。

    ip

    验证的字段必须是 IP 地址。

    ipv4

    验证的字段必须是 IPv4 地址。

    ipv6

    验证的字段必须是 IPv6 地址。

    json

    验证的字段必须是有效的 JSON 字符串。

    max:value

    验证中的字段必须小于或等于 value。字符串、数字、数组或是文件大小的计算方式都用 size 方法进行评估。

    mimetypes:text/plain,…

    验证的文件必须与给定 MIME 类型之一匹配:

    'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'
    

    要确定上传文件的 MIME 类型,会读取文件的内容来判断 MIME 类型,这可能与客户端提供的 MIME 类型不同。

    mimes:foo,bar,…

    验证的文件必须具有与列出的其中一个扩展名相对应的 MIME 类型。

    MIME 规则基本用法

    'photo' => 'mimes:jpeg,bmp,png'
    

    即使你可能只需要验证指定扩展名,但此规则实际上会验证文件的 MIME 类型,其通过读取文件的内容以猜测它的 MIME 类型。

    这个过程看起来只需要你指定扩展名,但实际上该规则是通过读取文件的内容并判断其 MIME 的类型来验证的。

    min:value

    验证中的字段必须具有最小值。字符串、数字、数组或是文件大小的计算方式都用 size 方法进行评估。

    nullable

    验证的字段可以为 null。这在验证基本数据类型时特别有用,例如可以包含空值的字符串和整数。

    not_in:foo,bar,…

    验证的字段不能包含在给定的值列表中。Rule::notIn 方法可以用来构建规则:

    use Illuminate\Validation\Rule;
    
    Validator::make($data, [
        'toppings' => [
            'required',
            Rule::notIn(['sprinkles', 'cherries']),
        ],
    ]);
    

    numeric

    验证的字段必须是数字。

    present

    验证的字段必须存在于输入数据中,但可以为空。

    regex:pattern

    验证的字段必须与给定的正则表达式匹配。

    注意: 当使用 regex 规则时,你必须使用数组,而不是使用 | 分隔符,特别是如果正则表达式包含 | 字符。

    required

    验证的字段必须存在于输入数据中,而不是空。如果满足以下条件之一,则字段被视为「空」:

    该值为 null.
    该值为空字符串。
    该值为空数组或空的 可数 对象。
    该值为没有路径的上传文件。

    required_if:anotherfield,value,…

    如果指定的其它字段( anotherfield )等于任何一个 value 时,被验证的字段必须存在且不为空。

    required_unless:anotherfield,value,…
    如果指定的其它字段( anotherfield )等于任何一个 value 时,被验证的字段不必存在。

    required_with:foo,bar,…
    只要在指定的其他字段中有任意一个字段存在时,被验证的字段就必须存在并且不能为空。

    required_with_all:foo,bar,…
    只有当所有的其他指定字段全部存在时,被验证的字段才必须存在并且不能为空。

    required_without:foo,bar,…
    只要在其他指定的字段中有任意一个字段不存在,被验证的字段就必须存在且不为空。

    required_without_all:foo,bar,…
    只有当所有的其他指定的字段都不存在时,被验证的字段才必须存在且不为空。

    same:field

    给定字段必须与验证的字段匹配。

    size:value

    验证的字段必须具有与给定值匹配的大小。对于字符串来说,value 对应于字符数。对于数字来说,value 对应于给定的整数值。对于数组来说, size 对应的是数组的 count 值。对文件来说,size 对应的是文件大小(单位 kb )。

    string

    验证的字段必须是字符串。如果要允许该字段的值为 null ,就将 nullable 规则附加到该字段中。

    timezone

    验证的字段必须是有效的时区标识符,会根据 PHP 函数 timezone_identifiers_list 来判断。

    url

    验证的字段必须是有效的 URL。

    结束

    以上很多为开发过程中经常使用的方法,希望文章总结可以给你带来帮助👍

    展开全文
  • laravel validate

    2016-09-01 11:30:00
    使用laravel的artisan命令 php artisan make:request XxxxxRequest.php中进行验证 使用request验证的好处是可以 表单使用ajax提交的时候 框架会自动返回json错误消息,其他提交方式 框架仍然使用$message返回 ...

    如何进行验证

    典型的注册表单:

    <!-- app/views/form.blade.php -->
    {{ Form::open(array('url' => 'registration')) }}
        {{-- Username field. ------------------------}}
        {{ Form::label('username', 'Username') }} {{ Form::text('username') }} {{-- Email address field. -------------------}} {{ Form::label('email', 'Email address') }} {{ Form::email('email') }} {{-- Password field. ------------------------}} {{ Form::label('password', 'Password') }} {{ Form::password('password') }} {{-- Password confirmation field. -----------}} {{ Form::label('password_confirmation', 'Password confirmation') }} {{ Form::password('password_confirmation') }} {{-- Form submit button. --------------------}} {{ Form::submit('Register') }} {{ Form::close() }} 

    路由部分:

    // app/routes.php
    Route::get('/', function() { return View::make('form'); }); Route::post('/registration', function() { // 获取所有表单数据. $data = Input::all(); // 创建验证规则 $rules = array( 'username' => array('alpha_num', 'min:3') ); // 开始验证 $validator = Validator::make($data, $rules); if ($validator->passes()) { // 验证成功 return 'Data was saved.'; } // 验证失败 return Redirect::to('/'); }); 

    可用的验证规则

    regex:pattern(正则)

    验证此规则的值必须符合给定的正则表达式。

    accepted(yes|no|1)

    验证此规则的值必须是 yes、 on 或者是 1。这在验证是否同意"服务条款"的时候非常有用。

    in:foo,bar,...(in 规则)

    验证此规则的值必须在给定的列表中存在。

    notin:_foo,bar,...(not in 规则)

    验证此规则的值必须在给定的列表中不存在。

    alpha(全部字母)

    验证此规则的值必须全部由字母字符构成。

    numeric(数字)

    验证此规则的值必须是一个数字。

    alpha_num(字母|数字)

    验证此规则的值必须全部由字母和数字构成。

    alpha_dash(字母|数字|中划线|下划线)

    验证此规则的值必须全部由字母、数字、中划线或下划线字符构成。

    url(合法 URL,不严谨)

    验证此规则的值必须是一个合法的 URL。
    注意: 已经证实此规则不严谨,类似 2http://url.com 的 URL 可以通过验证。

    active_url(合法 URL,基于 checkdnsrr)

    验证此规则的值必须是一个合法的 URL,根据 PHP 函数 checkdnsrr。
    注意: 由于是基于 checkdnsrr 因此也可用于验证邮箱地址是否存在。

    email(电子邮件)

    验证此规则的值必须是一个合法的电子邮件地址。

    image (jpeg|png|bmp|gif)

    验证此规则的值必须是一个图片 (jpeg, png, bmp 或者 gif)。

    integer(整数)

    验证此规则的值必须是一个整数。

    ip(IP 地址)

    验证此规则的值必须是一个合法的 IP 地址。

    before:date(给定日期之前)

    验证此规则的值必须在给定日期之前,日期将通过 PHP 函数 strtotime 传递。

    after:date(给定日期之后)

    验证此规则的值必须在给定日期之后,日期将通过 PHP 函数 strtotime 传递。

    between:min,max(min 和 max 之间)

    验证此规则的值必须在给定的 min 和 max 之间。字符串、数字以及文件都将使用大小规则进行比较。

    confirmed(二次确认域,如“密码的二次确认域”)

    验证此规则的值必须和 foo_confirmation 的值相同。比如,需要验证此规则的域是 password,那么在输入中必须有一个与之相同的 password_confirmation 域。

    same:field(值与给定域相同)

    验证此规则的值必须与给定域的值相同。

    size:value(大小与给定域的值相同)

    验证此规则的值的大小必须与给定的 value 相同。
    对于字符串,value 代表字符的个数,
    对于数字,value 代表它的整数值,
    对于文件,value 代表文件以KB为单位的大小。

    date(合法日期字符串,基于 strtotime)

    验证此规则的值必须是一个合法的日期,根据 PHP 函数 strtotime。

    dateformat:_format(format 格式 y-m-d H:i:s)

    验证此规则的值必须符合给定的 format 的格式,根据 PHP 函数 date_parse_from_format。

    different:field(不同于)

    验证此规则的值必须与指定的 field 域的值不同。

    min:value(最小值)

    验证此规则的值必须大于最小值 value。字符串、数字以及文件都将使用大小规则进行比较。

    max:value(最大值)

    验证此规则的值必须小于最大值 value。字符串、数字以及文件都将使用大小规则进行比较。

    mimes:foo,bar,...(MIME 类型限制)

    验证此规则的文件的 MIME 类型必须在给定的列表中。

    MIME 规则的基础使用
    'photo' => 'mimes:jpeg,bmp,png'
    

    注意: 当使用 regex 模式的时候,有必要使用数组指定规则,而不是管道分隔符,特别是正则表达式中包含一个管道字符的时候。

    required(必填)

    验证此规则的值必须在输入数据中存在。

    requiredif:_field,value(当指定域为某个值时,必填)

    当指定的域为某个值的时候,验证此规则的值必须存在。

    requiredwith:_foo,bar,...(当指定域存在时,必填)

    仅当指定的域存在的时候,验证此规则的值必须存在。

    requiredwithout:_foo,bar,...(当指定域不存在时,必填)

    仅当指定的域不存在的时候,验证此规则的值必须存在。

    exists:table,column(必须存在于 table 表的 column 字段数据中)

    验证此规则的值必须在指定的数据库的表中存在。

    Exists 规则的基础使用
    'state' => 'exists:states'
    

    指定列名

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

    您也可以指定更多的条件,将以 "where" 的形式添加到查询。

    'email' => 'exists:staff,email,account_id,1'
    

    unique:table,column,except,idColumn(数据库唯一)

    验证此规则的值必须在给定的数据库的表中唯一。如果 column 没有被指定,将使用该域的名字。

    Unique 规则的基础使用
    'email' => 'unique:users'
    

    指定列名

    'email' => 'unique:users,email_address'
    

    强制忽略一个给定的 ID

    'email' => 'unique:users,email_address,10'
    

    添加额外的where语句
    你还可以指定更多条件,这些条件将被添加到查询的"where"语句中:

    'email' => 'unique:users,email_address,NULL,id,account_id,1
    

    在上面的规则中,只有account_id 为 1 的行才会被包含到unique检查中。

    如何获取错误消息

    构造为 JSON 数据(API)

    Route::post('/registration', function() { // 获取全部提交数据 $data = Input::all(); // 构造规则数组 $rules = array( 'username' => 'alpha_num' ); // 开始验证 $validator = Validator::make($data, $rules); if ($validator->passes()) { // 验证通过 return 'Data was saved.'; } // 验证失败 // 获取错误消息 $errors = $validator->messages(); // 构造 JSON 响应 return Response::json($errors); }); 

    重定向,直接传递至下一个页面

    return Redirect::to('/')->withErrors($validator);
    
    视图中如何获取传递过来的错误消息

    注意: $errors 是系统预定义变量,任何模板中均可使用。

    获取一个域的第一个错误消息
    {{ $errors->first('username') }}
    
    获取一个域的全部错误消息
    @foreach($errors->get('username') as $message)
        <li>{{ $message }}</li>
    @endforeach 
    获取全部域的全部错误消息
    @foreach($errors->all() as $message)
        <li>{{ $message }}</li>
    @endforeach
    
    检查一个域是否存在消息
    @if($errors->has('email'))
        <p>Yey, an error!</p>
    @endif
    
    以某种格式获取一条错误消息
    {{ $errors->first('username', '<span class="error">:message</span>') }}
    

    注意: 默认情况下,消息将使用与 Bootstrap 兼容的语法进行格式化。

    以某种格式获取所有错误消息
    @foreach($errors->all('<li>:message</li>') as $message)
        {{ $message }}
    @endforeach 

    定制验证规则

    注意: 匿名函数 和 指向普通类方法 的 规则扩展 并不推荐,因此直接介绍如何直接扩展官方的验证器。

    编写扩展验证器类:

    class ExValidator extends Illuminate\Validation\Validator { // 规则 public function validateFoo($attribute, $value, $parameters) { return $value == 'foo'; } // 消息 protected function replaceFoo($message, $attribute, $rule, $parameters) { return str_replace(':foo', $parameters[0], $message); } } 

    注册定制的验证器扩展:

    Validator::resolver(function($translator, $data, $rules, $messages) { return new ExValidator($translator, $data, $rules, $messages); }); 

    详细的编写方法请参照官方类 /vendor/laravel/framework/src/Illuminate/Validation/Validator.php 。

    定制验证消息

    针对某一个验证规则:

    $messages = array(
        'required' => 'The :attribute field is required.',
    );
    $validator = Validator::make($input, $rules, $messages);
    

    针对指定域的某一规则:

    $messages = array(
        'email.required' => 'We need to know your e-mail address!',
    );
    

    在语言文件中定义 /app/lang/zh-CN/validation.php

    'custom' => array(
        'email' => array( 'required' => '请填写您的 email 地址。', ), ),

    原文:http://my.oschina.net/5say/blog/186568

    我个人更喜欢使用Request方式进行验证;使用laravel的artisan命令 php artisan make:request XxxxxRequest.php中进行验证
    使用request验证的好处是可以 表单使用ajax提交的时候 框架会自动返回json错误消息,其他提交方式 框架仍然使用$message返回

    转载于:https://www.cnblogs.com/qiyongchu/p/5829143.html

    展开全文
  • 今天小编就为大家分享一篇Laravel validate error处理,ajax,json示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 今天小编就为大家分享一篇laravel validate 设置为中文的例子(验证提示为中文),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • laravel validate数据验证

    千次阅读 2019-12-05 10:08:08
    我们用用户注册作为demo讲解validate 注册需要 用户名 非空唯一 密码 非空 6-12位 只允许数字和大小写字母 确认密码 非空 6-12位 只允许数字和大小写字母与密码一致 操作步骤: 第一步新建路由:(这里直接提供...
    我们用用户注册作为demo讲解validate
    
    注册需要
    
    用户名 非空唯一
    密码 非空 6-12位 只允许数字和大小写字母
    确认密码 非空 6-12位 只允许数字和大小写字母与密码一致
    操作步骤:
    
    第一步新建路由:(这里直接提供整个路由组)
    
    Route::prefix('book')->group(function () {
            route::get('index','Book\BookController@add');
            route::post('doadd','Book\BookController@doadd');
            route::any('list','Book\BookController@lists');
            route::get('login',"Book\UserController@login");
            route::post('logindo',"Book\UserController@logindo");
            route::get('register',"Book\UserController@register");
            route::post('registerdo',"Book\UserController@registerdo");
    
    });
    第二步 创建前台页面 register.blade.php
    
    <html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0">
        <link rel="stylesheet" href="{{url("css/weui.css")}}">
        <title>登录</title>
    </head>
    <body>
    @if($errors->any())
        <div>
            @foreach($errors->all() as $v)
                <p>{{$v}}</p>
                @endforeach
        </div>
    
      @endif
    <form action="{{url("book/registerdo")}}" method="post">
        @csrf
        <div class="weui-cell">
            <div class="weui-cell__hd"><label class="weui-label">用户名</label></div>
            <div class="weui-cell__bd">
                <input class="weui-input" type="text"  placeholder="请输入用户名" name="username"/>
            </div>
        </div>
        <div class="weui-cell">
            <div class="weui-cell__hd"><label class="weui-label">密码</label></div>
            <div class="weui-cell__bd">
                <input class="weui-input" type="password"  placeholder="请输入密码" name="pwd"/>
            </div>
        </div>
        <div class="weui-cell">
            <div class="weui-cell__hd"><label class="weui-label">确认密码</label></div>
            <div class="weui-cell__bd">
                <input class="weui-input" type="password"  placeholder="请输入确认密码" name="pwd1"/>
            </div>
        </div>
        <div>
            <input type="submit" value="注册"  class="weui-btn weui-btn_primary">
        </div>
    </form>
    </body>
    </html>
    这里添加了在页面显示报错信息在页面顶部,可以根据自己需求自定义显示位置
    
    @if($errors->any())
        <div>
            @foreach($errors->all() as $v)
                <p>{{$v}}</p>
                @endforeach
        </div>
    
      @endif
    第三步:新建控制器UserController 实现用户相关操作
    
    方法一:使用validator类中的make方法进行验证
    
    make可以有三个参数 
        第一个参数:要验证的值
        第二个参数:规则
        第三个参数:返回信息
    <?php
    
    namespace App\Http\Controllers\Book;
    
    use App\Http\Requests\Register;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    use Illuminate\Support\Facades\Validator;
    
    class UserController extends Controller
    {
        //
        public function login()
        {
            return view("book.login");
        }
        public function register()
        {
            return view("book.register");
        }
        public function registerdo(Request $request)
        {
        
            $validate = Validator::make($request->all(),[  'username'=>"required|unique:user,name",
                'pwd'=>"required|min:6|max:12|regex:/^[a-zA-Z0-9]+$/"],[
              "username.required"=>'用户名不能是空',
              "username.unique"=>'用户名已经存在',
              "pwd.required"=>'密码不能是空',
              "pwd.min"=>"密码不能小于6位",
              "pwd.max"=>"密码不能大于12位",
              "pwd.regex"=>"密码格式不对,只能输入字母和数字",
          ]);
    
        }
    }
    方式二:使用$request->validata()进行验证
    
    <?php
    
    namespace App\Http\Controllers\Book;
    
    use App\Http\Requests\Register;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    use Illuminate\Support\Facades\Validator;
    
    class UserController extends Controller
    {
        //
        public function login()
        {
            return view("book.login");
        }
        public function register()
        {
            return view("book.register");
        }
        public function registerdo(Request $request)
        {
         
         $validate =  $request->validate(['username'=>"required|unique:user,name",
                'pwd'=>"required|min:6|max:12|regex:/^[a-zA-Z0-9]+$/"],[
              "username.required"=>'用户名不能是空',
              "username.unique"=>'用户名已经存在',
              "pwd.required"=>'密码不能是空',
              "pwd.min"=>"密码不能小于6位",
              "pwd.max"=>"密码不能大于12位",
              "pwd.regex"=>"密码格式不对,只能输入字母和数字",
          ]);
            dd($validate->errors());
        }
    }
    方式三:使用request验证类
    
    首先使用命令生成一个Request类
    
    php artisan make:request RegisterRequest
    生成后编写页面内容
    
    其中
    
    authorize方法是用户验证的方法 为了模拟结果可以直接改成return true
    rules 方法编写所有的规则
    messages 方法编写返回的信息
    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    class Register extends FormRequest
    {
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'username'=>"required|unique:user,name",
                'pwd'=>"required|min:6|max:12|regex:/^[a-zA-Z0-9]+$/"
            ];
        }
    
        public  function messages()
        {
            return[
                "username.required"=>'用户名不能是空',
                "username.unique"=>'用户名已经存在',
                "pwd.required"=>'密码不能是空',
                "pwd.min"=>"密码不能小于6位",
                "pwd.max"=>"密码不能大于12位",
                "pwd.regex"=>"密码格式不对,只能输入字母和数字",
            ];
        }
    }
    然后编写控制器
    
    <?php
    
    namespace App\Http\Controllers\Book;
    
    use App\Http\Requests\Register;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    use Illuminate\Support\Facades\Validator;
    
    class UserController extends Controller
    {
        //
        public function login()
        {
            return view("book.login");
        }
        public function register()
        {
            return view("book.register");
        }
        public function registerdo(RegisterRequest $request)
        {
           $validate = $request->validated();
            //如果验证不通过,会自动跳回原页面
    
         
        }
    }
    三种数据方式都可以,选择适合你自己的使用就可以了
    
    展开全文
  • laravel validate 验证器

    万次阅读 2018-09-09 13:50:20
    Laravel 提供了多种方法来验证应用输入数据。默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验证规则来验证输入的 HTTP 请求。 2、快速入门 要掌握...

    1、简介

    Laravel 提供了多种方法来验证应用输入数据。默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验证规则来验证输入的 HTTP 请求。

    2、快速入门

    要掌握 Laravel 强大的验证特性,让我们先看一个完整的验证表单并返回错误信息给用户的例子。

    定义路由

    首先,我们假定在routes/web.php文件中包含如下路由:

    // 显示创建博客文章表单...
    Route::get('post/create', 'PostController@create');
    // 存储新的博客文章...
    Route::post('post', 'PostController@store');

    当然,GET 路由为用户显示了一个创建新的博客文章的表单,POST 路由将新的博客文章存储到数据库。

    创建控制器

    接下来,让我们看一个处理这些路由的简单控制器示例。我们先将store方法留空:

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    
    class PostController extends Controller{
        /**
         * 显示创建新的博客文章的表单
         *
         * @return Response
         */
        public function create()
        {
            return view('post.create');
        }
    
        /**
         * 存储新的博客文章
         *
         * @param  Request  $request
         * @return Response
         */
        public function store(Request $request)
        {
            // 验证并存储博客文章...
        }
    }

    编写验证逻辑

    现在我们准备用验证新博客文章输入的逻辑填充store方法。如果你检查应用的控制器基类(App\Http\Controllers\Controller),你会发现该类使用了ValidatesRequests trait,这个trait在所有控制器中提供了一个便利的validate方法。

    validate方法接收一个HTTP请求输入数据和验证规则,如果验证规则通过,代码将会继续往下执行;然而,如果验证失败,将会抛出一个异常,相应的错误响应也会自动发送给用户。在一个传统的HTTP请求案例中,将会生成一个重定向响应,如果是AJAX请求则会返回一个JSON响应。

    要更好的理解validate方法,让我们回到store方法:

    /**
     * 存储博客文章
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request){
        $this->validate($request, [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);
    
        // 验证通过,存储到数据库...
    }

    正如你所看到的,我们只是传递输入的HTTP请求和期望的验证规则到validate方法,在强调一次,如果验证失败,相应的响应会自动生成。如果验证通过,控制器将会继续正常执行。

    首次验证失败后中止后续规则验证

    有时候你可能想要在首次验证失败后停止检查属性其它验证规则,要实现这个功能,可以在属性中分配bail规则:

    $this->validate($request, [
        'title' => 'bail|required|unique:posts|max:255',
        'body' => 'required',]
    );

    在这个例子中,如果title属性上的required规则验证失败,则不会检查unique规则,规则会按照分配顺序依次进行验证。

    嵌套属性注意事项

    如果HTTP请求中包含“嵌套”参数,可以使用“.”在验证规则中指定它们:

    $this->validate($request, [
        'title' => 'required|unique:posts|max:255',
        'author.name' => 'required',
        'author.description' => 'required',
    ]);

    显示验证错误信息

    那么,如果请求输入参数没有通过给定验证规则怎么办?正如前面所提到的,Laravel将会自动将用户重定向回上一个位置。此外,所有验证错误信息会自动一次性存放到session

    注意我们并没有在GET路由中明确绑定错误信息到视图。这是因为Laravel总是从session数据中检查错误信息,而且如果有的话会自动将其绑定到视图。所以,值得注意的是每次请求的所有视图中总是存在一个$errors变量,从而允许你在视图中方便而又安全地使用。$errors变量是的一个Illuminate\Support\MessageBag实例。想要了解更多关于该对象的信息,查看其文档

    注:$errors变量会通过web中间件组中的Illuminate\View\Middleware\ShareErrorsFromSession中间件绑定到视图,如果使用了该中间件,那么$errors变量在视图中总是有效,从而方便你随时使用。

    所以,在我们的例子中,验证失败的话用户将会被重定向到控制器的create方法,从而允许我们在视图中显示错误信息:

    <!-- /resources/views/post/create.blade.php -->
    
    <h1>Create Post</h1>
    
    @if (count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif
    
    <!-- Create Post Form -->

    自定义错误格式

    如果你想要自定义保存在session中的验证错误信息的格式,需要在控制器基类中重写formatValidationErrors方法(不要忘了在该控制器类的顶部导入Illuminate\Contracts\Validation\Validator类):

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Foundation\Bus\DispatchesJobs;
    use Illuminate\Contracts\Validation\Validator;
    use Illuminate\Routing\Controller as BaseController;
    use Illuminate\Foundation\Validation\ValidatesRequests;
    
    abstract class Controller extends BaseController{
        use DispatchesJobs, ValidatesRequests;
    
        /**
         * {@inheritdoc}
         */
        protected function formatValidationErrors(Validator $validator)
        {
            return $validator->errors()->all();
        }
    }

    AJAX请求&验证

    在这个例子中,我们使用传统的表单来发送数据到应用。然而,很多应用使用AJAX请求。在AJAX请求中使用validate方法时,Laravel不会生成重定向响应。取而代之的,Laravel生成一个包含验证错误信息的JSON响应。该JSON响应会带上一个HTTP状态码422

    3、表单请求验证

    创建表单请求

    对于更复杂的验证场景,你可能想要创建一个“表单请求”。表单请求是包含验证逻辑的自定义请求类,要创建表单验证类,可以使用Artisan命令make:request

    php artisan make:request StoreBlogPost

    生成的类位于app/Http/Requests目录下,接下来我们添加少许验证规则到rules方法:

    /**
     * 获取应用到请求的验证规则
     *
     * @return array
     */
    public function rules(){
        return [
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ];
    }

    那么,验证规则如何生效呢?你所要做的就是在控制器方法中类型提示该请求。表单输入请求会在控制器方法被调用之前被验证,这就是说你不需要将控制器和验证逻辑杂糅在一起:

    /**
     * 存储输入的博客文章
     *
     * @param  StoreBlogPostRequest  $request
     * @return Response
     */
    public function store(StoreBlogPost $request){
        // The incoming request is valid...
    }

    如果验证失败,重定向响应会被生成并将用户退回上一个位置,错误信息也会被一次性存储到session以便在视图中显示。如果是AJAX请求,带422状态码的HTTP响应将会返回给用户,该响应数据中还包含了JSON格式的验证错误信息。

    认证表单请求

    表单请求类还包含了一个authorize方法,你可以检查认证用户是否有资格更新指定资源。例如,如果用户尝试更新一个博客评论,那么他是否是评论的所有者呢?举个例子:

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        $comment = Comment::find($this->route('comment'));
        return $comment && $this->user()->can('update', $comment);
    }

    由于所有请求都继承自Laravel请求基类,我们可以使用user方法获取当前认证用户,还要注意上面这个例子中对route方法的调用。该方法赋予用户访问被调用路由URI参数的权限,比如下面这个例子中的{comment}参数:

    Route::post('comment/{comment}');

    如果authorize方法返回false,一个包含403状态码的HTTP响应会自动返回而且控制器方法将不会被执行。

    如果你计划在应用的其他部分包含认证逻辑,只需在authorize方法中简单返回true即可:

    /**
     * 判断请求用户是否经过认证
     *
     * @return bool
     */
    public function authorize(){
        return true;
    }

    自定义错误格式

    如果你想要自定义验证失败时一次性存储到session中验证错误信息的格式,重写请求基类(App\Http\Requests\Request)中的formatErrors方法即可。不要忘记在文件顶部导入Illuminate\Contracts\Validation\Validator类:

    /**
     * {@inheritdoc}
     */
    protected function formatErrors(Validator $validator){
        return $validator->errors()->all();
    }

    自定义错误消息

    你可以通过重写messages方法自定义表单请求使用的错误消息,该方法应该返回属性/规则对数组及其对应错误消息:

    /**
     * Get the error messages for the defined validation rules.
     *
     * @return array
     */
    public function messages(){
        return [
            'title.required' => 'A title is required',
            'body.required'  => 'A message is required',
        ];
    }

    4、 手动创建验证器

    如果你不想使用ValidatesRequests trait提供的validate方法,可以使用Validator门面手动创建一个验证器实例,该门面上的make方法用于生成一个新的验证器实例:

    <?php
    
    namespace App\Http\Controllers;
    
    use Validator;
    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    
    class PostController extends Controller{
        /**
         * 存储新的博客文章
         *
         * @param  Request  $request
         * @return Response
         */
        public function store(Request $request)
        {
            $validator = Validator::make($request->all(), [
                'title' => 'required|unique:posts|max:255',
                'body' => 'required',
            ]);
    
            if ($validator->fails()) {
                return redirect('post/create')
                            ->withErrors($validator)
                            ->withInput();
            }
    
            // 存储博客文章...
        }
    }

    传递给make方法的第一个参数是需要验证的数据,第二个参数是要应用到数据上的验证规则。

    检查请求是够通过验证后,可以使用withErrors方法将错误数据一次性存放到session,使用该方法时,$errors变量重定向后自动在视图间共享,从而允许你轻松将其显示给用户,withErrors方法接收一个验证器、或者一个MessageBag,又或者一个PHP数组。

    自动重定向

    如果你想要手动创建一个验证器实例,但仍然使用ValidatesRequest trait提供的自动重定向,可以调用已存在验证器上的validate方法,如果验证失败,用户将会被自动重定向,或者,如果是AJAX请求的话,返回JSON响应:

    Validator::make($request->all(), [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ])->validate();

    命名错误包

    如果你在单个页面上有多个表单,可能需要命名MessageBag,从而允许你为指定表单获取错误信息。只需要传递名称作为第二个参数给withErrors即可:

    return redirect('register')
        ->withErrors($validator, 'login');

    然后你就可以从$errors变量中访问命名的MessageBag实例:

    {{ $errors->login->first('email') }}

    验证钩子之后

    验证器允许你在验证完成后添加回调,这种机制允许你轻松执行更多验证,甚至添加更多错误信息到消息集合。使用验证器实例上的after方法即可:

    $validator = Validator::make(...);
    
    $validator->after(function($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });
    
    if ($validator->fails()) {
        //
    }
    

    5、处理错误信息

    调用Validator实例上的errors方法之后,将会获取一个Illuminate\Support\MessageBag实例,该实例中包含了多种处理错误信息的便利方法。在所有视图中默认有效的$errors变量也是一个MessageBag实例。

    获取某字段的第一条错误信息

    要获取指定字段的第一条错误信息,可以使用first方法:

    $messages = $validator->errors();
    echo $messages->first('email');

    获取指定字段的所有错误信息

    如果你想要简单获取指定字段的所有错误信息数组,使用get方法:

    foreach ($messages->get('email') as $message) {
        //
    }

    如果是一个数组表单字段,可以使用*获取所有数组元素错误信息:

    foreach ($errors->get('attachments.*') as $message) {
        //
    }

    获取所有字段的所有错误信息

    要获取所有字段的所有错误信息,可以使用all方法:

    foreach ($messages->all() as $message) {
        //
    }

    判断消息中是否存在某字段的错误信息

    has方法可用于判断错误信息中是否包含给定字段:

    if ($messages->has('email')) {
        //
    }

    获取指定格式的错误信息

    echo $messages->first('email', '<p>:message</p>');

    获取指定格式的所有错误信息

    foreach ($messages->all('<li>:message</li>') as $message) {
        //
    }

    自定义错误信息

    如果需要的话,你可以使用自定义错误信息替代默认的,有多种方法来指定自定义信息。首先,你可以传递自定义信息作为第三方参数给Validator::make方法:

    $messages = [
        'required' => 'The :attribute field is required.',
    ];
    
    $validator = Validator::make($input, $rules, $messages);

    在本例中,:attribute占位符将会被验证时实际的字段名替换,你还可以在验证消息中使用其他占位符,例如:

    $messages = [
        'same'    => 'The :attribute and :other must match.',
        'size'    => 'The :attribute must be exactly :size.',
        'between' => 'The :attribute must be between :min - :max.',
        'in'      => 'The :attribute must be one of the following types: :values',
    ];

    为给定属性指定自定义信息

    有时候你可能只想为特定字段指定自定义错误信息,可以通过“.”来实现,首先指定属性名,然后是规则:

    $messages = [
        'email.required' => 'We need to know your e-mail address!',
    ];

    在语言文件中指定自定义消息

    在很多案例中,你可能想要在语言文件中指定属性特定自定义消息而不是将它们直接传递给Validator。要实现这个,添加消息到resources/lang/xx/validation.php语言文件的custom数组:

    'custom' => [
        'email' => [
            'required' => 'We need to know your e-mail address!',
        ],
    ],

    6、验证规则大全

    下面是有效规则及其函数列表:

    accepted

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

    active_url

    该字段必须是一个基于PHP函数checkdnsrr 的有效URL

    after:date

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

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

    你可以指定另外一个比较字段而不是使用strtotime验证传递的日期字符串:

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

    alpha

    该字段必须是字母

    alpha_dash

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

    alpha_num

    该字段必须是字母或数字

    array

    该字段必须是PHP数组

    before:date

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

    between:min,max

    验证字段尺寸在给定的最小值和最大值之间,字符串、数值和文件都可以使用该规则

    boolean

    验证字段必须可以被转化为boolean,接收truefalse1,0"1", 和 "0"等输入。

    confirmed

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

    date

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

    date_format:format

    验证字段必须匹配指定格式,该格式将使用PHP函数date_parse_from_format进行验证。你应该在验证字段时使用datedate_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'

    distinct

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

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

    email

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

    exists:table,column

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

    基本使用:

    'state' => 'exists:states'

    指定自定义列名:

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

    还可以添加更多查询条件到where查询子句:

    'email' => 'exists:staff,email,account_id,1'

    这些条件还可以包含!

    'email' => 'exists:staff,email,role,!admin'

    还可以传递NULLNOT NULL到where子句:

    'email' => 'exists:staff,email,deleted_at,NULL'
    'email' => 'exists:staff,email,deleted_at,NOT_NULL'

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

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

    file

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

    filled

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

    image

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

    in:foo,bar…

    验证字段值必须在给定的列表中

    in_array:另一个字段

    验证字段必须在另一个字段中存在

    integer

    验证字段必须是整型

    ip

    验证字段必须是IP地址

    JSON

    验证字段必须是有效的JSON字符串

    max:value

    验证字段必须小于等于最大值,和字符串、数值、文件字段的size规则一起使用

    mimetypes:text/plain...

    验证文件必须匹配给定的MIME文件类型之一:

    'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'

    为了判断上传文件的MIME类型,框架将会读取文件内容来猜测MIME类型,这可能会和客户端MIME类型不同。

    mimes:foo,bar,…

    验证文件的MIMIE类型必须是该规则列出的扩展类型中的一个

    MIMIE规则的基本使用:

    'photo' => 'mimes:jpeg,bmp,png'

    尽管你只需要指定扩展,该规则实际上验证的是通过读取文件内容获取到的文件MIME类型。
    完整的MIME类型列表及其相应的扩展可以在这里找到:http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types

    min:value

    验证字段的最小值,对字符串、数值、文件字段而言,和size规则使用方式一致。

    nullable

    验证字段可以是null,这在验证一些可以为null的原生数据如整型或字符串时很有用。

    not_in:foo,bar,…

    验证字段值不在给定列表中

    numeric

    验证字段必须是数值

    present

    验证字段必须出现在输入数据中但可以为空。

    regex:pattern

    验证字段必须匹配给定正则表达式

    注:使用regex模式时,规则必须放在数组中,而不能使用管道分隔符,尤其是正则表达式中使用管道符号时。

    required

    输入字段值不能为空,以下情况字段值都为空:

    • 值为null
    • 值是空字符串
    • 值是空数组或者空的Coutable对象
    • 值是上传文件但路径为空

    required_if:anotherfield,value,…

    验证字段在另一个字段等于指定值value时是必须的

    required_unless:anotherfield,value,…

    除了 anotherfield 字段等于value,验证字段不能空

    required_with:foo,bar,…

    验证字段只有在任一其它指定字段存在的话才是必须的

    required_with_all:foo,bar,…

    验证字段只有在所有指定字段存在的情况下才是必须的

    required_without:foo,bar,…

    验证字段只有当任一指定字段不存在的情况下才是必须的

    required_without_all:foo,bar,…

    验证字段只有当所有指定字段不存在的情况下才是必须的

    same:field

    给定字段和验证字段必须匹配

    size:value

    验证字段必须有和给定值value相匹配的尺寸,对字符串而言,value是相应的字符数目;对数值而言,value是给定整型值;对文件而言,value是相应的文件字节数

    string

    验证字段必须是字符串

    timezone

    验证字符必须是基于PHP函数timezone_identifiers_list的有效时区标识

    unique:table,column,except,idColumn

    验证字段在给定数据表上必须是唯一的,如果不指定column选项,字段名将作为默认column

    指定自定义列名:

    'email' => 'unique:users,email_address'

    自定义数据库连接

    有时候,你可能需要自定义验证器生成的数据库连接,正如上面所看到的,设置unique:users作为验证规则将会使用默认数据库连接来查询数据库。要覆盖默认连接,在数据表名后使用“.”指定连接:

    'email' => 'unique:connection.users,email_address'

    强制一个唯一规则来忽略给定ID:

    有时候,你可能希望在唯一检查时忽略给定ID,例如,考虑一个包含用户名、邮箱地址和位置的”更新属性“界面,当然,你将会验证邮箱地址是唯一的,然而,如果用户只改变用户名字段而并没有改变邮箱字段,你不想要因为用户已经拥有该邮箱地址而抛出验证错误,你只想要在用户提供的邮箱已经被别人使用的情况下才抛出验证错误,要告诉唯一规则忽略用户ID,可以传递ID作为第三个参数:

    'email' => 'unique:users,email_address,'.$user->id

    如果你的数据表使用主键字段不是id,可以指定第四个输入参数:

    'email' => 'unique:users,email_address,'.$user->id.',user_id'

    添加额外的where子句:

    还可以指定更多条件给where子句:

    'email' => 'unique:users,email_address,NULL,id,account_id,1'

    在上述规则中,只有account_id为1记录才会进行唯一性检查。

    url

    验证字段必须是基于PHP函数filter_var过滤的的有效URL

    7、添加条件规则

    验证何时出现

    在某些场景下,你可能想要只有某个字段存在的情况下运行验证检查,要快速完成这个,添加sometimes规则到规则列表:

    $v = Validator::make($data, [
        'email' => 'sometimes|required|email',
    ]);

    在上例中,email字段只有存在于$data数组时才会被验证。

    复杂条件验证

    有时候你可能想要基于更复杂的条件逻辑添加验证规则。例如,你可能想要只有在另一个字段值大于100时才要求一个给定字段是必须的,或者,你可能需要只有当另一个字段存在时两个字段才都有给定值。添加这个验证规则并不是一件头疼的事。首先,创建一个永远不会改变的静态规则到Validator实例:

    $v = Validator::make($data, [
        'email' => 'required|email',
        'games' => 'required|numeric',
    ]);

    让我们假定我们的web应用服务于游戏收集者。如果一个游戏收集者注册了我们的应用并拥有超过100个游戏,我们想要他们解释为什么他们会有这么多游戏,例如,也许他们在运营一个游戏二手店,又或者他们只是喜欢收集。要添加这种条件,我们可以使用Validator实例上的sometimes方法:

    $v->sometimes('reason', 'required|max:500', function($input) {
        return $input->games >= 100;
    });

    传递给sometimes方法的第一个参数是我们需要有条件验证的名称字段,第二个参数是我们想要添加的规则,如果作为第三个参数的闭包返回true,规则被添加。该方法让构建复杂条件验证变得简单,你甚至可以一次为多个字段添加条件验证:

    $v->sometimes(['reason', 'cost'], 'required', function($input) {
        return $input->games >= 100;
    });

    注:传递给闭包的$input参数是Illuminate\Support\Fluent的一个实例,可用于访问输入和文件。

    8、验证数组输入

    验证表单数组输入字段不再是件痛苦的事情,例如,要验证给定数组输入中每个email是否是唯一的,可以这么做:

    $validator = Validator::make($request->all(), [
        'person.*.email' => 'email|unique:users',
        'person.*.first_name' => 'required_with:person.*.last_name',
    ]);

    类似地,在语言文件中你也可以使用*字符指定验证消息,从而可以使用单个消息定义基于数组字段的验证规则:

    'custom' => [
        'person.*.email' => [
            'unique' => 'Each person must have a unique e-mail address',
        ]
    ],

    9、自定义验证规则

    Laravel提供了多种有用的验证规则;然而,你可能还是想要指定一些自己的验证规则。注册验证规则的一种方法是使用Validator门面的extend方法。让我们在服务提供者中使用这种方法来注册一个自定义的验证规则:

    <?php
    
    namespace App\Providers;
    
    use Validator;
    use Illuminate\Support\ServiceProvider;
    class AppServiceProvider extends ServiceProvider
    {
        /**
         * 启动应用服务
         *
         * @return void
         */
        public function boot()
        {
            Validator::extend('foo', function($attribute, $value, $parameters, $validator) {
                return $value == 'foo';
            });
        }
    
        /**
         * 注册服务提供者
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }
    

    自定义验证器闭包接收四个参数:要验证的属性名称、属性值、传递给规则的参数数组以及Validator实例。

    你还可以传递类和方法到extend方法而不是闭包:

    Validator::extend('foo', 'FooValidator@validate');

    定义错误信息

    你还需要为自定义规则定义错误信息。你可以使用内联自定义消息数组或者在验证语言文件中添加条目来实现这一目的。消息应该被放到数组的第一维,而不是在只用于存放属性指定错误信息的custom数组内:

    "foo" => "Your input was invalid!",
    "accepted" => "The :attribute must be accepted.",
    // 验证错误信息其它部分...

    当创建一个自定义验证规则时,你可能有时候需要为错误信息定义自定义占位符,可以通过创建自定义验证器然后调用Validator门面上的replacer方法来实现。可以在服务提供者boot方法中编写代码:

    /**
     * 启动应用服务
     *
     * @return void
     */
    public function boot(){
        Validator::extend(...);
        Validator::replacer('foo', function($message, $attribute, $rule, $parameters) {
            return str_replace(...);
        });
    }

    隐式扩展

    默认情况下,被验证的属性如果没有提供或者验证规则为required而值为空,那么正常的验证规则,包括自定义扩展将不会执行。例如,unique规则将不会检验null值:

    
    $rules = ['name' => 'unique'];
    $input = ['name' => null];
    Validator::make($input, $rules)->passes(); // true
    

    如果要求即使为空时也要验证属性,则必须要暗示属性是必须的,要创建一个隐式扩展,可以使用Validator::extendImplicit()方法:

    
    Validator::extendImplicit('foo', function($attribute, $value, $parameters, $validator) {
        return $value == 'foo';
    });

    注:一个隐式扩展仅仅暗示属性是必须的,至于它到底是缺失的还是空值这取决于你。

    展开全文
  • laravel validate学习笔记

    2019-08-19 15:48:00
    Laravel 自带一个简单、方便的 Validation 类用于验证数据以及获取错误消息。 http://www.cnblogs.com/yjf512/p/4324159.html 在model里面定义 public function checkValidate($data){ $rules = array( 'email' =...
  • 场景:api和网站都同时用到了同一个 request,但是api需要返回json数据。 处理:定义基类request,在类中重写failedValidation方法 &lt;?php namespace App\Http\Requests;...use Illuminate\Contracts\Valid...
  • 如下所示: public function updateLevelTestRecords(Request $request) {... 以上这篇Laravel validate error处理,ajax,json示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
  • Laravel validate 500异常 添加手机验证,中文验证与Validator验证的“半个”生命周期
  • Laravel validate error处理,ajax,json

    千次阅读 2018-01-19 10:57:55
    @endforeach </ul> </div> @endif 6、validate实现的原理,laravel 5.5的可以参考这个文件。 D:\phpStudy\WWW\BCCKidAdmin\vendor\laravel\framework\src\Illuminate\Validation\Concerns\ValidatesAttributes.php ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,961
精华内容 1,184
关键字:

laravel的validate