摘要:對于這樣嵌套的,使用來校驗(yàn)對象間關(guān)系很重要,可以看做是進(jìn)入核心業(yè)務(wù)邏輯前的初步校驗(yàn)。。當(dāng)然最后寫表時(shí)還有,避免壞數(shù)據(jù)進(jìn)入。,總之,在寫程序時(shí),很重要,需要去寫,包括和。。。
在用laravel寫api時(shí),當(dāng)前端傳進(jìn)來的request是POST/PUT/PATH等method時(shí),那需要做request validation,盡管對于前后端分離程序,前端程序Angular/Vue已經(jīng)做了validation,但是ajax傳過來的json input,在后端也需要做validation。
那該如何優(yōu)雅的編寫request validation呢?laravel官方文檔已經(jīng)包含了這個(gè)feature: Form Request Validation
這里可以寫一個(gè)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 => [ // ... ], "*" => [ // ... ], ]; }
這樣就可以校驗(yàn)前端傳進(jìn)來的json input是否合法。
(1)如果前端傳進(jìn)來的json input是:
{ "name": "lx1036", "type": "loan", "bank_account": { "source": "bank", } }
那就validation失敗,不合法。
(2) 如果前端傳進(jìn)來的json input是:
{ "name": "lx1036", "type": "bank", "loan_account": { "source": "loan", } }
那就validation失敗,不合法。
這樣就可以校驗(yàn)json input,不合法就直接彈回throw 一個(gè)HttpException,不再用在進(jìn)入下一步邏輯。對于這樣嵌套的json input,使用request validation來校驗(yàn)對象間關(guān)系很重要,可以看做是進(jìn)入核心業(yè)務(wù)邏輯前的初步校驗(yàn)。。當(dāng)然最后寫表時(shí)還有model validation,避免壞數(shù)據(jù)進(jìn)入db。
最后一點(diǎn),laravel文檔只是說了用法,沒有說明原理。代碼在IlluminateFoundationProvidersFormRequestServiceProvider::class:
public function boot() { // IlluminateFoundationHttpFormRequest use 了 ValidatesWhenResolvedTrait,extends 了 IlluminateContractsValidationValidatesWhenResolved $this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) { $resolved->validate(); }); // ... }
所以當(dāng)從容器中resolve完IlluminateFoundationHttpFormRequest后就會立即執(zhí)行IlluminateFoundationHttpFormRequest::validate()方法,具體不詳述,可看laravel源碼。
OK,總之,在寫程序時(shí),validation很重要,需要去寫,包括request validation和model validation。。。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30693.html
摘要:在或自定義一個(gè)中寫上是表示所有的,即任何一個(gè)的寫操作都會觸發(fā)該事件。這里業(yè)務(wù)不同,不同,不做過多解釋。這個(gè)的目的主要是從邏輯上校驗(yàn)輸入數(shù)據(jù)的合法性。,總之一般情況下,在寫數(shù)據(jù)庫前都需要做,避免無效。 在對database進(jìn)行寫操作前,需要對數(shù)據(jù)進(jìn)行validation,如type-check 每一個(gè) model column 的定義(type 這個(gè)column必須是enum(card,...
摘要:總結(jié)本文主要學(xué)習(xí)了啟動(dòng)時(shí)做的七步準(zhǔn)備工作環(huán)境檢測配置加載日志配置異常處理注冊注冊啟動(dòng)。 說明:Laravel在把Request通過管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動(dòng)Bootstrap工作,本文主要學(xué)習(xí)相關(guān)源碼,看看Laravel啟動(dòng)程序做了哪些具體工作,并將個(gè)人的研究心得分享出來,希望對別人有所幫助。Laravel在入口index...
摘要:學(xué)習(xí)筆記之已經(jīng)聊過使用了來設(shè)計(jì),看源碼發(fā)現(xiàn)其巧妙用了和的一些數(shù)組函數(shù)來設(shè)計(jì)。開發(fā)環(huán)境內(nèi)置函數(shù)和看源碼之前,先看下這幾個(gè)內(nèi)置函數(shù)的使用。學(xué)習(xí)筆記之實(shí)例化源碼解析已經(jīng)聊過的實(shí)例化,得到中的變量,即的實(shí)例化對象。后面再學(xué)習(xí)下的源碼,到時(shí)見。 說明:本文主要學(xué)習(xí)Laravel的Middleware的源碼設(shè)計(jì)思想,并將學(xué)習(xí)心得分享出來,希望對別人有所幫助。Laravel學(xué)習(xí)筆記之Decorato...
摘要:然后中間件使用方法來啟動(dòng)獲取實(shí)例,使用類來管理主要分為兩步獲取實(shí)例,主要步驟是通過該實(shí)例從存儲介質(zhì)中讀取該次請求所需要的數(shù)據(jù),主要步驟是。 說明:本文主要通過學(xué)習(xí)Laravel的session源碼學(xué)習(xí)Laravel是如何設(shè)計(jì)session的,將自己的學(xué)習(xí)心得分享出來,希望對別人有所幫助。Laravel在web middleware中定義了session中間件IlluminateSess...
摘要:說明在上篇中學(xué)習(xí)了的啟動(dòng)過程,主要分為兩步,一是的實(shí)例化,即的實(shí)例化二是從存儲介質(zhì)中讀取的數(shù)據(jù)。第二步就是操作,包括對數(shù)據(jù)的增刪改查操作,本文也主要聊下相關(guān)操作源碼。下篇再學(xué)習(xí)下關(guān)閉,到時(shí)見。 說明:在上篇中學(xué)習(xí)了session的啟動(dòng)過程,主要分為兩步,一是session的實(shí)例化,即IlluminateSessionStore的實(shí)例化;二是從session存儲介質(zhì)redis中讀取id ...
閱讀 740·2021-11-17 09:33
閱讀 3773·2021-09-01 10:46
閱讀 1762·2019-08-30 11:02
閱讀 3292·2019-08-29 15:05
閱讀 1407·2019-08-26 11:39
閱讀 2283·2019-08-23 17:04
閱讀 1983·2019-08-23 15:43
閱讀 1379·2019-08-23 14:12