Laravel提供了Validator模块,可解决表单提交验证等一些需求,而且能够在视图View中显示错误验证信息,交互仍是很友好的。注明:做者水平有限,有错误或建议请指正,轻拍。php
Laravel中在Controller.php文件中引用了trait为ValidatesRequests,这个trait源码在/Illuminate/Foundation/Validation/ValidatesRequests.php,源码文件中主要包含了两个共有方法:validate()和validateWithBag(),有时间能够浏览浏览。。css
Route::get('laravel/test/validator', 'PHPTestController@getValidator'); Route::post('laravel/test/validator', 'PHPTestController@postValidator');
PHPTestController可由php artisan make:controller PHPTestController
这个Laravel自带的artisan命令来建立。
在PHPTestController控制器中写上getValidator方法:html
public function getValidator(){ return view('validator.validator'); }
该方法直接返回一个表单提交页面,表单提交页面视图代码为,文件路径为resources/validator/validator.blade.php:jquery
<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也能够是你的共有域名,则表单提交页面为:
laravel
而后写上表单提交方法postValidator:web
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!!!"
,说明验证模块已经工做了,但页面没有显示验证错误信息。bootstrap
在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其实是Illuminate\Support\MessageBag
的实例对象,MessageBag类里比较好用的几个方法如all()/get()/first()/has()
等等,如今从新提交表单:
浏览器
在表单页面就会显示验证的错误信息!!!session
错误信息是由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文件中,把\Illuminate\Session\Middleware\StartSession::class,\Illuminate\View\Middleware\ShareErrorsFromSession::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看下。
修改下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>
修改下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()
。
authorize()方法主要用来设置用户权限,返回false时会返回一个403而且控制器代码不能执行,如没有权限的用户不能提交表单。这里直接把该方法源代码改成return true
。
rules()方法里主要写表单验证规则,在这里把控制器中postValidator()方法的规则抽取出来放在这里:
return [ 'person.*.name'=>'required', 'person.*.age'=>'required|integer' ];
直接把TestValidatorRequest依赖注入进postValidator(*),这样laravel会自动验证规则:
public function postValidator(TestValidatorRequest $request){ //业务逻辑 dd('form post success!!!'); }
一个好用的PHP调试函数:debug_backtrace()
,在laravel任意一个文件如本身建立的PHPTestController
控制器的postValidator()
函数中加上一句:
var_dump(debug_backtrace());die();
会打印程序执行流程,看不清楚显示网页源代码看看,效率小神器。