Laravel5.2之Validator

引言:

Laravel提供了Validator模塊,可解決表單提交驗證等一些需求,而且能夠在視圖View中顯示錯誤驗證信息,交互仍是很友好的。註明:做者水平有限,有錯誤或建議請指正,輕拍。php

概述:

Laravel中在Controller.php文件中引用了trait爲ValidatesRequests,這個trait源碼在/Illuminate/Foundation/Validation/ValidatesRequests.php,源碼文件中主要包含了兩個共有方法:validate()和validateWithBag(),有時間能夠瀏覽瀏覽。。css

(一)、post表單提交,並在視圖中顯示驗證錯誤信息

一、先在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方法: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()

一、在TestValidatorRequest類裏寫驗證規則

authorize()方法主要用來設置用戶權限,返回false時會返回一個403而且控制器代碼不能執行,如沒有權限的用戶不能提交表單。這裏直接把該方法源代碼改成return true
rules()方法裏主要寫表單驗證規則,在這裏把控制器中postValidator()方法的規則抽取出來放在這裏:

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

二、重寫控制器中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();

會打印程序執行流程,看不清楚顯示網頁源代碼看看,效率小神器。

相關文章
相關標籤/搜索