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();
會打印程序執行流程,看不清楚顯示網頁源代碼看看,效率小神器。