成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

imingyu / 1758人閱讀

摘要:對于這樣嵌套的,使用來校驗(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

相關(guān)文章

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

    摘要:在或自定義一個(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,...

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

    摘要:總結(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...

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

    摘要:學(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...

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

    摘要:然后中間件使用方法來啟動(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...

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

    摘要:說明在上篇中學(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 ...

    longshengwang 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<