例如,要使用手機號加驗證碼的方式提供登錄網站的功能,那么在處理前端提交的 form 表單時,就不得不對提交的手機號及驗證碼做基本的數據校驗。
手寫規則,非常浪費時間。使用 laravel 內置的 validation 功能可以節省大量的代碼及時間,而且可讀性好一萬倍。
新建一個 request
php artisan make:request LoginPost
使用獨立的 form request validation 的原因是,可以方便的自定義錯誤信息。
此時會新增一個 request 文件 app/Http/Requests/LoginPost.php
在其中設置校驗規則,及定制化的錯誤信息。(默認是英文錯誤信息)
public function rules() { return [ 'tel' =>'required|regex:/^1[0-9]{10}$/', 'code' => 'required|digits:6', ]; } public function messages() { return [ 'tel.required' => '請填寫手機號', 'tel.regex' => '手機號格式錯誤', 'code.required' => '請填寫驗證碼', 'code.digits' => '驗證碼格式錯誤', ]; }
注意,不要忘記將生成的 request 文件中的 authorize 函數中的 return false 改成 return true.
建立驗證規則之后,需要將 controller 中對應的處理函數的 Request 替換成定制化的 Request.
例如
public function login(Request $request)
替換成
public function login(LoginPost $request)
如果提交的數據沒有通過驗證規則,則 laravel 會自動將請求重定向到之前的請求路徑。
在 blade 模板中顯示錯誤信息
@if ($errors->any()) <div class="jd_login_panle_input" style="padding: 0 26px; font-size: 13px; color: red;"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
內置的校驗規則
https://laravel.com/docs/5.5/validation#available-validation-rules
增加業務流程相關的校驗錯誤信息
例如,驗證碼不匹配這樣的錯誤,在 laravel 內置的校驗規則中是無法實現的,這就需要自己去實現。
然后當校驗失敗時,append 定制化的錯誤信息。
// 驗證碼校驗 $redis_code = Redis::get(env('APP_NAME').'sms'.$tel); if ($redis_code != $code) { $validator = Validator::make($request->all(), []); $validator->errors()->add('code', '驗證碼錯誤'); return redirect('/login')->withErrors($validator)->withInput(); }
參考
https://laravel.com/docs/5.5/validation
