表單請(qǐng)求驗(yàn)證

2018-02-24 15:52 更新

如果是更復(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ì)象。

授權(quán)表單請(qǐng)求

表單請(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;
}

自定義閃存后的錯(cuò)誤信息格式

如果你想要自定義驗(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();
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)