首頁  >  文章  >  後端開發  >  Laravel之request validation的編寫詳解

Laravel之request validation的編寫詳解

黄舟
黄舟原創
2017-10-26 10:32:411426瀏覽

前言

本文主要給大家介紹了關於Laravel之request validation編寫的相關內容,在用laravel寫api時,當前端傳進來的request是POST /PUT/PATH等method時,那需要做request validation,儘管對於前後端分離程序,前端程序Angular/Vue已經做了validation,但是ajax傳過來的json input,在後端也需要做validation。

那該如何優雅的寫request validation呢? laravel官方文件已經包含了這個feature: Form Request Validation

#實作方法如下

這裡可以寫一個JsonRequest:

class JsonRequest extends Illuminate\Foundation\Http\FormRequest
{
 public function rules()
 {
  $method = $this->method();
  
  assert(in_array($method, [static::METHOD_POST, static::METHOD_PUT, static::METHOD_PATCH], true));
  
  $controller = $this->route()->getController();
  $rules  = $controller::RULES;

  return ($rules[$this->method()] ?? []) + ($rules['*'] ?? []);
 }

 public function authorize()
 {
  return true;
 }
}

這樣就可以在眾多Model Controller裡使用JsonRequest就行,如:

use Illuminate\Http\Request;

final class AccountController extends \App\Http\Controllers\Controller
{
 public const RULES = [
  Request::METHOD_POST => [
   'bank_account' => 'required_if:type,bank',
   'loan_account' => 'required_if:type,loan',
  ],
  Request::METHOD_PUT => [
   // ...
  ],
  '*' => [
   // ...
  ],
 ];
}

這樣就可以校驗前端傳進來的json input是否合法。

(1)如果前端傳進來的json input是:

{
 "name": "lx1036",
 "type": "loan",
 "bank_account": {
  "source": "bank",
 }
}

那就validation失敗,不合法。

(2) 如果前端傳進來的json input是:

{
 "name": "lx1036",
 "type": "bank",
 "loan_account": {
  "source": "loan",
 }
}

那就validation失敗,不合法。

這樣就可以校驗json input,不合法就直接彈回throw 一個HttpException,不再用在進入下一步邏輯。對於這樣嵌套的json input,使用request validation來校驗物件間關係很重要,可以看做是進入核心業務邏輯前的初步校驗。 。當然最後寫表時還有model validation,避免壞數據進入db。

最後一點,laravel文件只是說了用法,沒有說明原理。程式碼在\Illuminate\Foundation\Providers\FormRequestServiceProvider::class:

 public function boot()
 {
  // \Illuminate\Foundation\Http\FormRequest use 了 ValidatesWhenResolvedTrait,extends 了 \Illuminate\Contracts\Validation\ValidatesWhenResolved
  $this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) {
   $resolved->validate();
  });

  // ...
 }

所以當從容器中resolve完\Illuminate\Foundation\Http\FormRequest後就會立即執行\Illuminate\Foundation\Http\FormRequest:Http\FormRequest:Http\FormRequest:Http\FormRequest:Http\FormRequest:Http\FormRequest: :validate()方法,具體不詳述,可看laravel源碼。

OK,總之,在寫程式時,validation很重要,需要去寫,包括request validation和model validation。 。 。

總結

#

以上是Laravel之request validation的編寫詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn