2

引言:

Laravel提供了Validator模块,可解决表单提交验证等一些需求,并且可以在视图View中显示错误验证信息,交互还是很友好的。
注明:作者水平有限,有错误或建议请指正,轻拍。


概述:

Laravel中在Controller.php文件中引用了trait为ValidatesRequests,这个trait源码在/Illuminate/Foundation/Validation/ValidatesRequests.php,源码文件中主要包含了两个共有方法:validate()和validateWithBag(),有时间可以浏览浏览。。


(一)、post表单提交,并在视图中显示验证错误信息

1、先在routes.php中写两个路由:


    Route::get('laravel/test/validator', 'PHPTestController@getValidator');
    Route::post('laravel/test/validator', 'PHPTestController@postValidator');

PHPTestController可由php artisan make:controller PHPTestController这个Laravel自带的artisan命令来创建。
在PHPTestController控制器中写上getValidator方法:


    public function getValidator(){
        return view('validator.validator');
    }

2、写表单视图页面

该方法直接返回一个表单提交页面,表单提交页面视图代码为,文件路径为resources/validator/validator.blade.php:


    <html>
        <head>
            <title>Laravel Validator Test</title>
            <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
        </head>
        <body>
            <div class="container">
                <div class="row">
                    <div class="col-md-12">
                        <form action="{{url('laravel/test/validator')}}" method="POST">
                            <legend style="text-align: center">表单提交</legend>
                            <legend style="text-align: center">Person</legend>
                            <label style="margin-left: 50%">Name</label>
                            <input type="text" name="name">
                            <label style="margin-left: 50%">Age</label>
                            <input type="text" name="age">
                            <button type="submit" class="btn btn-success">Submit</button>
                        </form>
                    </div>
                </div>
            </div>
    
            <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
            <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
        </body>
    </html>

在浏览器中访问http://XXX/laravel/test/validator这个路由,其中XXX为你的host,可以是虚拟的host也可以是你的共有域名,则表单提交页面为:
图片描述

3、写表单提交控制器

然后写上表单提交方法postValidator:


    public function postValidator(Request $request){
    //        $tmp = $request->get('name');
    //        return $tmp;
            $this->validate($request, [
                'name' => 'required',
                'age'  => 'required|integer',
            ]);
            dd('form post success!!!');
        }

填写表单,name="name"和age="age",点击提交按钮,没有打印"form post success!!!";填写name="name"和age="18",打印"form post success!!!",说明验证模块已经工作了,但页面没有显示验证错误信息。

4、写显示验证错误信息视图

在laravel中,laravel会在每次请求把$errors变量刷到session中,和视图模板绑定,所以$errors变量在视图模板中可用,官方文档原话:"So, it is important to note that an $errors variable will always be available in all of your views on every request",所以可直接在validator.blade.php文件中加上:


    @if(count($errors) > 0)
        <div class="alert alert-danger">
            <ul>
                @foreach($errors->all() as $error)
                    <li>{{$error}}</li>
                @endforeach
            </ul>
        </div>
    @endif

可在</form>结束标签后加上上面的代码,$errors实际上是IlluminateSupportMessageBag的实例对象,MessageBag类里比较好用的几个方法如all()/get()/first()/has()等等,现在重新提交表单:
图片描述

图片描述

在表单页面就会显示验证的错误信息!!!

5、定制显示错误信息

错误信息是由laravel默认的,如果自定义显示错误信息,如:


    public function postValidator(Request $request){
    //        $tmp = $request->get('name');
    //        return $tmp;
            $this->validate($request, [
                'person.*.name' => 'required',
                'person.*.age'  => 'required|integer',
            ], ['person.*.name.required' => 'Required!!!']);
            dd('form post success!!!');
    }

只需要在validate(*)方法中加上$message[]参数就行,如代码中['person.*.name.required' => 'Required'],简单方便。
如果针对对于多个页面的person.*.name都写同样的错误显示信息,可以在resources/lang/en/validation.php文件中做定制:


    'custom' => [
                'attribute-name' => [
                    'rule-name' => 'custom-message',
                ],
                'person.*.name' => [
                    'required' => 'Required!!!',
                ],
                'person.*.age' => [
                    'required' => 'Age must be required!!!',
                   // 'min' => 'Age must be over 18!!!',
                ],
            ],

注意:

如果显示$errors变量不存在等错误,这主要是在app/Http/Kernel.php文件中,把IlluminateSessionMiddlewareStartSession::class,IlluminateViewMiddlewareShareErrorsFromSession::class,从web中加到全局中间件$middleware中,或者在你写路由的时候加上web中间件:


    Route::group(['middleware'=>'web'], function(){
        Route::get('laravel/test/validator','PHPTestController@getValidator');
        Route::post('laravel/test/validator', 'PHPTestController@postValidator');
    });

(二)、验证数组形式表单

有时候在写表单时,需要同时输入相类似的表单输入时,可以把这些input作为数组看待,laravel5.2也提供了数组形式的验证,可以利用一个小demo看下。

1、重写下表单提交页面

修改下validator.blade.php中代码:


    <legend style="text-align: center">表单提交</legend>
    <legend style="text-align: center">Person</legend>
    <label style="margin-left: 50%">Name</label>
    <input type="text" name="person[1][name]">
    <label style="margin-left: 50%">Age</label>
    <input type="text" name="person[1][age]">
    <label style="margin-left: 50%">Name</label>
    <input type="text" name="person[2][name]">
    <label style="margin-left: 50%">Age</label>
    <input type="text" name="person[2][age]">
    <label style="margin-left: 50%">Name</label>
    <input type="text" name="person[3][name]">
    <label style="margin-left: 50%">Age</label>
    <input type="text" name="person[3][age]">
    <button type="submit" class="btn btn-success">Submit</button>

2、重写下表单提交控制器

修改下postValidator(*)方法:


    public function postValidator(Request $request){
    //        $tmp = $request->get('name');
    //        return $tmp;
            $this->validate($request, [
                'person.*.name' => 'required',
                'person.*.age'  => 'required|integer',
            ]);
            dd('form post success!!!');
        }

不填写输入直接提交表单,错误信息显示:
图片描述

或者
图片描述

图片描述


(三)、定制一个表单请求类,把验证规则从控制中抽取出来

有时候,把验证规则逻辑单独放在一个类里,使得控制器代码更加简约。laravel提供了php artisan make:request TestValidatorRequest命令来创建一个单独类存放验证规则,生成的TestValidatorRequest.php文件存放在app/Http/Requests文件夹下。该存储类主要有两个重要方法:authorize()和rules()

1、在TestValidatorRequest类里写验证规则

authorize()方法主要用来设置用户权限,返回false时会返回一个403并且控制器代码不能执行,如没有权限的用户不能提交表单。这里直接把该方法源代码改为return true
rules()方法里主要写表单验证规则,在这里把控制器中postValidator()方法的规则抽取出来放在这里:

 

    return [
                'person.*.name'=>'required',
                'person.*.age'=>'required|integer'
            ];

2、重写控制器中postValidator(*)方法

直接把TestValidatorRequest依赖注入进postValidator(*),这样laravel会自动验证规则:


    public function postValidator(TestValidatorRequest $request){
        //业务逻辑
        
        dd('form post success!!!');
    }

One more thing...

一个好用的PHP调试函数:debug_backtrace(),在laravel任意一个文件如自己创建的PHPTestController控制器的postValidator()函数中加上一句:


    var_dump(debug_backtrace());die();

会打印程序执行流程,看不清楚显示网页源代码看看,效率小神器。

欢迎关注Laravel-China

RightCapital招聘Laravel DevOps


lx1036
3.1k 声望923 粉丝

为五斗米折腰