亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Laravel 學(xué)習(xí)筆記之 request validation

imingyu / 1824人閱讀

摘要:對于這樣嵌套的,使用來校驗對象間關(guān)系很重要,可以看做是進(jìn)入核心業(yè)務(wù)邏輯前的初步校驗。。當(dāng)然最后寫表時還有,避免壞數(shù)據(jù)進(jìn)入。,總之,在寫程序時,很重要,需要去寫,包括和。。。

在用laravel寫api時,當(dāng)前端傳進(jìn)來的request是POST/PUT/PATH等method時,那需要做request validation,盡管對于前后端分離程序,前端程序Angular/Vue已經(jīng)做了validation,但是ajax傳過來的json input,在后端也需要做validation。

那該如何優(yōu)雅的編寫request validation呢?laravel官方文檔已經(jīng)包含了這個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 => [
            // ...
        ],
        "*" => [
            // ...
        ],
    ];
}

這樣就可以校驗前端傳進(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失敗,不合法。

這樣就可以校驗json input,不合法就直接彈回throw 一個HttpException,不再用在進(jìn)入下一步邏輯。對于這樣嵌套的json input,使用request validation來校驗對象間關(guān)系很重要,可以看做是進(jìn)入核心業(yè)務(wù)邏輯前的初步校驗。。當(dāng)然最后寫表時還有model validation,避免壞數(shù)據(jù)進(jìn)入db。

最后一點,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,總之,在寫程序時,validation很重要,需要去寫,包括request validation和model validation。。。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/30693.html

相關(guān)文章

  • Laravel 學(xué)習(xí)筆記 model validation

    摘要:在或自定義一個中寫上是表示所有的,即任何一個的寫操作都會觸發(fā)該事件。這里業(yè)務(wù)不同,不同,不做過多解釋。這個的目的主要是從邏輯上校驗輸入數(shù)據(jù)的合法性。,總之一般情況下,在寫數(shù)據(jù)庫前都需要做,避免無效。 在對database進(jìn)行寫操作前,需要對數(shù)據(jù)進(jìn)行validation,如type-check 每一個 model column 的定義(type 這個column必須是enum(card,...

    diabloneo 評論0 收藏0
  • Laravel學(xué)習(xí)筆記bootstrap源碼解析

    摘要:總結(jié)本文主要學(xué)習(xí)了啟動時做的七步準(zhǔn)備工作環(huán)境檢測配置加載日志配置異常處理注冊注冊啟動。 說明:Laravel在把Request通過管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動Bootstrap工作,本文主要學(xué)習(xí)相關(guān)源碼,看看Laravel啟動程序做了哪些具體工作,并將個人的研究心得分享出來,希望對別人有所幫助。Laravel在入口index...

    xiaoxiaozi 評論0 收藏0
  • Laravel學(xué)習(xí)筆記Middleware源碼解析

    摘要:學(xué)習(xí)筆記之已經(jīng)聊過使用了來設(shè)計,看源碼發(fā)現(xiàn)其巧妙用了和的一些數(shù)組函數(shù)來設(shè)計。開發(fā)環(huán)境內(nèi)置函數(shù)和看源碼之前,先看下這幾個內(nèi)置函數(shù)的使用。學(xué)習(xí)筆記之實例化源碼解析已經(jīng)聊過的實例化,得到中的變量,即的實例化對象。后面再學(xué)習(xí)下的源碼,到時見。 說明:本文主要學(xué)習(xí)Laravel的Middleware的源碼設(shè)計思想,并將學(xué)習(xí)心得分享出來,希望對別人有所幫助。Laravel學(xué)習(xí)筆記之Decorato...

    _Dreams 評論0 收藏0
  • Laravel學(xué)習(xí)筆記Session源碼解析(上)

    摘要:然后中間件使用方法來啟動獲取實例,使用類來管理主要分為兩步獲取實例,主要步驟是通過該實例從存儲介質(zhì)中讀取該次請求所需要的數(shù)據(jù),主要步驟是。 說明:本文主要通過學(xué)習(xí)Laravel的session源碼學(xué)習(xí)Laravel是如何設(shè)計session的,將自己的學(xué)習(xí)心得分享出來,希望對別人有所幫助。Laravel在web middleware中定義了session中間件IlluminateSess...

    NervosNetwork 評論0 收藏0
  • Laravel學(xué)習(xí)筆記Session源碼解析(中)

    摘要:說明在上篇中學(xué)習(xí)了的啟動過程,主要分為兩步,一是的實例化,即的實例化二是從存儲介質(zhì)中讀取的數(shù)據(jù)。第二步就是操作,包括對數(shù)據(jù)的增刪改查操作,本文也主要聊下相關(guān)操作源碼。下篇再學(xué)習(xí)下關(guān)閉,到時見。 說明:在上篇中學(xué)習(xí)了session的啟動過程,主要分為兩步,一是session的實例化,即IlluminateSessionStore的實例化;二是從session存儲介質(zhì)redis中讀取id ...

    longshengwang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<