W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
如果是更復(fù)雜的驗(yàn)證場(chǎng)景,你可能需要?jiǎng)?chuàng)建一個(gè)"表單請(qǐng)求"。表單請(qǐng)求是一個(gè)自定義的請(qǐng)求類包含了一些驗(yàn)證的邏輯。你可以通過(guò) Artisan
的命令行 make:request 來(lái)創(chuàng)建一個(gè)表單請(qǐng)求類。
php artisan make:request StoreBlogPostRequest
生成的類會(huì)放置在 app/Http/Requests
目錄中。 我們?cè)?rules
方法中增加一些驗(yàn)證規(guī)則:
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|unique|max:255',
'body' => 'required',
];
}
那么,我們的驗(yàn)證規(guī)則是怎么執(zhí)行的呢?你所要做的只是在控制器方法中加上請(qǐng)求的類型提示:
/**
* Store the incoming blog post.
*
* @param StoreBlogPostRequest $request
* @return Response
*/
public function store(StoreBlogPostRequest $request)
{
// The incoming request is valid...
}
當(dāng)控制器的方法被調(diào)用前,表單請(qǐng)求已經(jīng)驗(yàn)證了,意味著你不需要在控制器里寫任何的驗(yàn)證邏輯。它已經(jīng)驗(yàn)證完了!
如果驗(yàn)證失敗,用戶會(huì)收到一個(gè)重定向請(qǐng)求至上一個(gè)頁(yè)面。而錯(cuò)誤信息也已經(jīng)存儲(chǔ)至 session 中方便視圖展示。如果收到的是一個(gè) AJAX 請(qǐng)求,一個(gè)帶有 422 狀態(tài)碼的 HTTP 響應(yīng)會(huì)被返回給瀏覽器,包含了一個(gè)含有錯(cuò)誤信息的 JSON 對(duì)象。
表單請(qǐng)求類同樣也包含了一個(gè) authorize 方法。通過(guò)這個(gè)方法,你可以檢查認(rèn)證后的用戶是否有權(quán)限去更新一個(gè)已有的資源。比如,如果一個(gè)用戶嘗試去更新一篇博客的評(píng)論,他是否真的發(fā)布過(guò)這個(gè)評(píng)論?舉個(gè)例子:
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
$commentId = $this->route('comment');
return Comment::where('id', $commentId)
->where('user_id', Auth::id())->exists();
}
注意上面例子中調(diào)用的 route 方法。這個(gè)方法允許你獲取調(diào)用路由中定義的 URI 參數(shù),比如下面例子中的 {comment} 參數(shù):
Route::post('comment/{comment}');
如果 authorize
方法返回 false, 一個(gè)帶有 403 狀態(tài)碼的 HTTP 響應(yīng)會(huì)被返回給瀏覽器,你控制器的方法也不會(huì)被執(zhí)行。
如果你打算在應(yīng)用的其他地方做一些權(quán)限的邏輯,在 authorize 方法中返回 true 即可:
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
如果你想要自定義驗(yàn)證失敗后已經(jīng)閃存至 session 的錯(cuò)誤消息格式,可以通過(guò)覆蓋基類請(qǐng)求類(App\Http\Requests\Request
)的 formatErrors
。不要忘記在文件頂部引入 Illuminate\Validation\Validator
類:
/**
* {@inheritdoc}
*/
protected function formatErrors(Validator $validator)
{
return $validator->errors()->all();
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: