前言
本文主要給大家介紹了關於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中文網其他相關文章!