表單請求
經過上述處理,確實可以起到表單驗證的功能,但是結果或許不是我們期望的,就拿輸出的錯誤提示來說吧,我們一般需要的是中文。Laravel也考慮到了這點,所以給我們提供了表單請求。
注意事項
正式開始之前,我們需要變更下控制器的結構,上述是通過控制器的一個方法處理兩種請求,但是這在使用表單請求的時候是行不通的,我們需要建立兩個方法,分別處理GET和POST。
路由
Route::get('register', 'IndexController@register');
Route::post('registerStore','IndexController@registerStore');
控制器方法
public function register()
{
return view('home.index.register');
}
public function registerStore()
{
}
視圖文件
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="post" action="{{url('registerStore')}}">
<p>username:<input type="text" name="username"/></p>
<p>password:<input type="password" name="password"/></p>
<p>{{ csrf_field() }}
<input type="submit" value="submit"></p>
</form>
新建表單請求
我們仍然通過artisan創建,命令如下。
php artisan make:request RegisterRequest
新建的表單請求文件會出現在app/Http/Requests文件夾下,具體內容如下。
表單請求文件
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class RegisterRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
如何使用?
1.在rules中填入驗證規則
表單請求文件
public function rules()
{
return [
'username'=>'bail|required|alpha_dash|min:6',
'password'=>'bail|required|alpha_dash|min:6',
];
}
2.控制器中引入表單請求
只需要use下,並且在需要使用該表單請求的方法中注入該類即可,其他無需任何操作。
控制器
use App\Http\Requests\RegisterRequest;
public function registerStore(RegisterRequest $request)
{
}
完成這兩部就成功了嗎?我們測試了一下,居然報錯了。
HTTP狀態碼:403
This action is unauthorized.
或許你猜到了些什麼,不錯就跟我們剛纔看到的表單請求文件中的authorize方法有關。
這個方法旨在驗證用戶是否有權限進行該請求,默認返回false,沒有權限。如果我們需要進行權限判斷,例如我們只需要某個URI具有該請求權限,我們就可以書寫對應邏輯關係,滿足條件的話返回true不滿足,返回false。如果沒有特別需求,可以直接返回true。
表單請求文件
public function authorize()
{
return true;
}
此時我們再次提交表單,是不是出現了跟表單驗證(一)中同樣的效果。但是我們控制器方法中卻沒有書寫任何的代碼,是不是更簡單了。
設置中文提示
有些朋友可能會問,說了這麼多,不還是沒有提到開頭說的中文提示的問題,不要着急,馬上就來。
除了authorize和rules之外,我們還可以在該文件中添加新的方法messages,該方法就是用來改變提示信息的。
表單請求文件
public function messages()
{
return [
'username.required'=>'用戶名必填',
];
}
return的是一個數組,數組的鍵名就是字段名“點”驗證規則,鍵值就是對應的提示信息。例如username.required就是把字段名爲username的字段和required的驗證規則結合,當用戶輸入爲空的時候,就會提示用戶名必填的中文提示了,替換了原有的The username field is required的英文提示。
但是如果每個都這麼改的話,確實有些浪費時間,有沒有更簡單的辦法呢?其實也很簡單,只需要再添加attributes方法,並跟messages相結合。
public function attributes()
{
return [
'username' => '用戶名',
'password' => '密碼',
];
}
public function messages()
{
return [
'required'=>':attribute必填',
'alpha_dash'=>':attribute輸入的字符必須是數字,字母,-或者_',
'min'=>':attribute不少於:min個字符',
];
}
attributes方法用來設置提示中的字段名稱,暫且假定你的messages沒有設置,只設置了attributes,那麼你的錯誤提示就會變爲"The 用戶名 field is required."。當然這也不是我們需要的結果,因此我們需要更改messages。但是如果是字段名點驗證規則的改法,那麼attributes就沒有任何意義了。爲了簡化我們的設置,不再進行重複勞動,Laravel給我們提供了佔位符:attribute,在提示信息中輸入佔位符,它會被驗證字段的實際名稱取代。除了屬性佔位符,還有其它佔位符,例如:min,:max等等。