摘要:對于這樣嵌套的,使用來校驗對象間關系很重要,可以看做是進入核心業務邏輯前的初步校驗。。當然最后寫表時還有,避免壞數據進入。,總之,在寫程序時,很重要,需要去寫,包括和。。。
在用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 IlluminateFoundationHttpFormRequest { 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 IlluminateHttpRequest; final class AccountController extends AppHttpControllersController { 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文檔只是說了用法,沒有說明原理。代碼在IlluminateFoundationProvidersFormRequestServiceProvider::class:
public function boot() { // IlluminateFoundationHttpFormRequest use 了 ValidatesWhenResolvedTrait,extends 了 IlluminateContractsValidationValidatesWhenResolved $this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) { $resolved->validate(); }); // ... }
所以當從容器中resolve完IlluminateFoundationHttpFormRequest后就會立即執行IlluminateFoundationHttpFormRequest::validate()方法,具體不詳述,可看laravel源碼。
OK,總之,在寫程序時,validation很重要,需要去寫,包括request validation和model validation。。。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30693.html
摘要:在或自定義一個中寫上是表示所有的,即任何一個的寫操作都會觸發該事件。這里業務不同,不同,不做過多解釋。這個的目的主要是從邏輯上校驗輸入數據的合法性。,總之一般情況下,在寫數據庫前都需要做,避免無效。 在對database進行寫操作前,需要對數據進行validation,如type-check 每一個 model column 的定義(type 這個column必須是enum(card,...
摘要:總結本文主要學習了啟動時做的七步準備工作環境檢測配置加載日志配置異常處理注冊注冊啟動。 說明:Laravel在把Request通過管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動Bootstrap工作,本文主要學習相關源碼,看看Laravel啟動程序做了哪些具體工作,并將個人的研究心得分享出來,希望對別人有所幫助。Laravel在入口index...
摘要:學習筆記之已經聊過使用了來設計,看源碼發現其巧妙用了和的一些數組函數來設計。開發環境內置函數和看源碼之前,先看下這幾個內置函數的使用。學習筆記之實例化源碼解析已經聊過的實例化,得到中的變量,即的實例化對象。后面再學習下的源碼,到時見。 說明:本文主要學習Laravel的Middleware的源碼設計思想,并將學習心得分享出來,希望對別人有所幫助。Laravel學習筆記之Decorato...
摘要:然后中間件使用方法來啟動獲取實例,使用類來管理主要分為兩步獲取實例,主要步驟是通過該實例從存儲介質中讀取該次請求所需要的數據,主要步驟是。 說明:本文主要通過學習Laravel的session源碼學習Laravel是如何設計session的,將自己的學習心得分享出來,希望對別人有所幫助。Laravel在web middleware中定義了session中間件IlluminateSess...
摘要:說明在上篇中學習了的啟動過程,主要分為兩步,一是的實例化,即的實例化二是從存儲介質中讀取的數據。第二步就是操作,包括對數據的增刪改查操作,本文也主要聊下相關操作源碼。下篇再學習下關閉,到時見。 說明:在上篇中學習了session的啟動過程,主要分為兩步,一是session的實例化,即IlluminateSessionStore的實例化;二是從session存儲介質redis中讀取id ...
閱讀 725·2021-11-17 09:33
閱讀 3757·2021-09-01 10:46
閱讀 1751·2019-08-30 11:02
閱讀 3280·2019-08-29 15:05
閱讀 1396·2019-08-26 11:39
閱讀 2272·2019-08-23 17:04
閱讀 1973·2019-08-23 15:43
閱讀 1371·2019-08-23 14:12