abap视图字段限制_在 Laravel 控制器中进行表单请求字段验证
在 Web 應用中,用戶提交的數據往往是不可預測的,因此一個非常常見的需求是對用戶提交的表單請求進行驗證,以確保用戶輸入的是我們所期望的數據格式。很多 Web 框架都對此功能專門提供了工具集,Laravel 也不例外,而且這個工具集異常豐富,基本上涵蓋了目前主流的所有驗證規則,即使是一些非常個性化的驗證,也可以基于 Laravel 驗證類的擴展功能來自定義驗證規則,非常強大。接下來,我們就一起來看看如何在 Laravel 中對表單請求進行驗證。
作為一個靈活的框架,Laravel 提供了多種方式對表單請求進行驗證,你可以在控制器中通過 $this->validate() 方法驗證用戶請求,也可以通過單獨的表單驗證類定義驗證規則,再將其注入到相應的控制器方法,我們由簡入繁,先從 validate() 方法說起。
通過 validate 方法進行驗證
在控制器中編寫驗證邏輯
通過 php artisan make:controller 生成的所有控制器默認都繼承自基類 App\Http\Controllers\Controller,因此所有這些控制器都使用了 ValidatesRequests Trait,進而可以使用該 Trait 中提供的 validate() 方法對請求字段進行驗證。
首先我們調整下 routes/web.php 中的表單提交路由,將其命名為 form.submit:
Route::post('form',?'RequestController@form')->name('form.submit');然后,修改 resources/views/request/form.blade.php 視圖中的表單,新增兩個字段,并將表單提交 URL 修改為上面定義的路由:
<form?action="{{?route('form.submit')?}}"?method="POST">??????<div?class="form-group">
??????????<label>標題label>
??????????<input?type="text"?name="title"?class="form-control"?placeholder="輸入標題">
??????div>
??????<div?class="form-group">
??????????<label>URLlabel>
??????????<input?type="text"?name="url"?class="form-control"?placeholder="輸入URL">
??????div>
??????<fileupload-component>fileupload-component>
??????<button?type="submit"?class="btn?btn-primary">提交button>
form>
然后到控制器 RequestController 修改 form 方法如下:
public?function?form(Request?$request,?$id){????$this->validate($request,?[
????????'title'?=>?'bail|required|string|between:2,32',
????????'url'?=>?'sometimes|url|max:200',
????????'picture'?=>?'nullable|string'
????]);
????return?response('表單驗證通過');
}
在該方法中,第一個參數是用戶請求實例,第二個參數是以數組形式定義的請求字段驗證規則,關于所有字段驗證規則及其說明你可以在驗證規則文檔中查看,這里我們定義 title 字段是必填的,格式是字符串,且長度介于2~32之間,并且通過bail 指定任何一個驗證規則不通過則立即退出,不再做后續校驗;url 字段通過 sometimes 指定為存在時驗證,如果填寫了的話格式必須是 URL,且長度不能超過 200,每填寫的話則不驗證;最后圖片路徑允許為空。不同的驗證規則之間通過 | 分隔。
如果表單驗證通過,則繼續向下執行,如果表單驗證不通過,會拋出 ValidationException 異常,具體怎么處理這個異常要看請求方式,如果是 Ajax 請求的話,將會返回包含錯誤信息的 JSON 響應(錯誤碼為 422),如果是正常的 POST 表單請求的話,會重定向到表單提交頁,并包含所有用戶輸入和錯誤信息,以便重新渲染已填寫表單并顯示錯誤信息。
下面我們分別以 POST 提交表單和 Ajax 請求為例簡單演示下驗證錯誤信息的讀取,首先來看 POST 提交表單。
在表單頁面顯示錯誤信息
我們需要修改下 form.blade.php 中的表單代碼,在 Blade 模板中可以通過 $errors 獲取驗證錯誤信息,通過 old() 輔助函數可以獲取用戶上次輸入數據:
<div?id="app">???<div?class="container">
???????@if?($errors->any())
???????????<div?class="alert?alert-danger">
???????????????<ul>
???????????????????@foreach?($errors->all()?as?$error)
???????????????????????<li>{{?$error?}}li>
???????????????????@endforeach
???????????????ul>
???????????div>
???????@endif
???????<form?action="{{?route('form.submit')?}}"?method="POST">
???????????<div?class="form-group">
???????????????<label>標題label>
???????????????<input?type="text"?name="title"?class="form-control"?placeholder="輸入標題"?value="{{?old('title')?}}">
???????????div>
???????????<div?class="form-group">
???????????????<label>URLlabel>
???????????????<input?type="text"?name="url"?class="form-control"?placeholder="輸入URL"?value="{{?old('url')?}}">
???????????div>
???????????<fileupload-component>fileupload-component>
???????????<button?type="submit"?class="btn?btn-primary">提交button>
???????form>
???div>
div>
這樣,刷新表單頁面后,提交數據,驗證失敗的情況下,就可以回顯用戶上次輸入數據和驗證錯誤信息了:
感覺提示不友好?我們可以在 $this->validate() 方法中的設置第三個參數來自定義錯誤消息:
$this->validate($request,?[???'title'?=>?'bail|required|string|between:2,32',
???'url'?=>?'sometimes|url|max:200',
???'picture'?=>?'nullable|string'
],?[
???'title.required'?=>?'標題字段不能為空',
???'title.string'?=>?'標題字段僅支持字符串',
???'title.between'?=>?'標題長度必須介于2-32之間',
???'url.url'?=>?'URL格式不正確,請輸入有效的URL',
???'url.max'?=>?'URL長度不能超過200',
]);
這樣,再次提交數據,錯誤信息就更加友好了:
Ajax 請求錯誤信息提示
接下來我們來看 Ajax 請求驗證錯誤信息的獲取和提示,我們以上一篇教程中的文件上傳為例。
首先在 RequestController 中修改 fileUpload 方法,設置上傳文件字段的驗證規則:
$this->validate($request,?[????'picture'?=>?'bail|required|image|mimes:jpg,png,jpeg|max:1024'
],[
????'picture.required'?=>?'請選擇要上傳的圖片',
????'picture.image'?=>?'只支持上傳圖片',
????'picture.mimes'?=>?'只支持上傳jpg/png/jpeg格式圖片',
????'picture.max'?=>?'上傳圖片超過最大尺寸限制(1M)'
]);
然后到 FileUploadComponent.vue 中修改錯誤提示代碼:
axios.post(??????'/form/file_upload',
??????formData,
??????{
??????????headers:?{
??????????????'Content-Type':?'multipart/form-data'
??????????}
??????}
??).then(function?(response)?{
??????$('#picture-path').val(response.data.path);
??????$('#picture-preview').html('?+?response.data.path?+?'">')
??}).catch(function?(error)?{if?(error.response.status?===?422)?{
??????????$.each(error.response.data.errors,?function?(field,?errors)?{
??????????????$('#picture-preview').append(''?+?errors[0]?+?'');
??????????});
??????}
??????console.log(error);
});
這樣當我們上傳不符合條件的文件時,就會進行錯誤提示了:
如果你使用的時 jQuery 的話,處理邏輯也是類似,根據錯誤碼 422 進行處理。
通過 Validator::make 方法進行驗證
如果你使用過 Laravel 自帶腳手架代碼實現登錄認證的話,你可能會留意到 RegisterController 中對用戶注冊請求進行驗證的時候,使用的是這樣的驗證代碼:
protected?function?validator(array?$data){????return?Validator::make($data,?[
????????'name'?=>?'required|string|max:255',
????????'email'?=>?'required|string|email|max:255|unique:users',
????????'password'?=>?'required|string|min:6|confirmed',
????]);
}?
這其實是通過 Validator 門面實現的驗證,原理和上面通過 $this->validate() 一樣,這是形式不同,這樣做的一個好處是在非控制器類中也可以對字段進行驗證,因為 validate 畢竟是 ValidatesRequests 中的方法,沒有使用這個 Trait 的話就不能在代碼中這么調用。如果我們將上面的表單請求改寫為 Validator::make 來實現的話,代碼是這樣的:
Validator::make($request->all(),?[???'title'?=>?'bail|required|string|between:2,32',
???'url'?=>?'sometimes|url|max:200',
???'picture'?=>?'nullable|string'
],?[
???'title.required'?=>?'標題字段不能為空',
???'title.string'?=>?'標題字段僅支持字符串',
???'title.between'?=>?'標題長度必須介于2-32之間',
???'url.url'?=>?'URL格式不正確,請輸入有效的URL',
???'url.max'?=>?'URL長度不能超過200',
])->validate();
除了第一個參數和最后要手動調動 validate() 方法外,其它參數都是一模一樣的,底層的處理方式也是一樣,所以其它地方的代碼都不需要做任何更改。如果是在控制器中進行請求驗證都可以,具體使用哪種方式,看你個人偏好了,如果是在其它地方比如服務類,可能 Validator::make 更合適些。
對于大量請求字段,或者復雜的請求驗證,都寫到控制器方法中顯然會導致控制器的代碼變得臃腫,可維護性也比較差,所以我們下一篇教程將討論如何將驗證代碼移出控制器這一話題,并且根據項目需求靈活實現自定義驗證規則。
本系列教程首發在學院君網站(xueyuanjun.com),你可以點擊頁面左下角閱讀原文鏈接查看最新更新的教程。
總結
以上是生活随笔為你收集整理的abap视图字段限制_在 Laravel 控制器中进行表单请求字段验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二阶差分预测后数据还原公式_携程如何基于
- 下一篇: lazada发货_Lazada怎么发货?