成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Laravel一次單元測(cè)試發(fā)現(xiàn)的'BUG',分析并解決問(wèn)題

zhiwei / 2293人閱讀

摘要:下面這段代碼是自帶的表單驗(yàn)證的語(yǔ)法,不太了解的可以先查看文檔也可以使用替換和我們期望的結(jié)果是能校驗(yàn)字段最小值是,最大值是當(dāng)我單元測(cè)試的時(shí)候發(fā)現(xiàn),竟然校驗(yàn)通過(guò)了單元測(cè)試代碼文檔分析我們看一下文檔驗(yàn)證中的字段必須具有最小值。

下面這段代碼是Laravel自帶的表單驗(yàn)證的語(yǔ)法,不太了解的可以先查看文檔

"group_num" => "min:1|max:21"  // 也可以使用between替換min和max

我們期望的結(jié)果是能校驗(yàn)group_num字段最小值是1,最大值是21

but ?。。?/p>

...

當(dāng)我單元測(cè)試的時(shí)候發(fā)現(xiàn),竟然校驗(yàn)通過(guò)了!

// 單元測(cè)試代碼

$warehouseId = 1;   
$prods = [      
    [         
        "prod_id" => 1,      
        "group_num" => 111,      
        "location" => 1,   
    ]
];   
$warehouseLogic = new WarehouseLogic();   
$result = $warehouseLogic->addProds($warehouseId, $prods);    
$this->assertEquals(ErrSvc::ERR_OK, $result["code"]);
文檔分析

我們看一下文檔

min:value

驗(yàn)證中的字段必須具有最小值。字符串、數(shù)字、數(shù)組或是文件大小的計(jì)算方式都用 size 方法進(jìn)行評(píng)估。

文章提到數(shù)字使用size方法進(jìn)行評(píng)估,我們看一下size方法的文檔

size:value

驗(yàn)證的字段必須具有與給定值匹配的大小。對(duì)于字符串來(lái)說(shuō),value 對(duì)應(yīng)于字符數(shù)。對(duì)于數(shù)字來(lái)說(shuō),value 對(duì)應(yīng)于給定的整數(shù)值。對(duì)于數(shù)組來(lái)說(shuō),
size 對(duì)應(yīng)的是數(shù)組的 count 值。對(duì)文件來(lái)說(shuō),size 對(duì)應(yīng)的是文件大?。▎挝?kb )。

代碼分析

文檔一切正常,我們翻一翻代碼試著分析下原因

我們找到驗(yàn)證類的文件并打開:vendorlaravelframeworksrcIlluminateValidationValidator.php

大約在1180行,我們看到validateMin()方法

validateMin()

第一行代碼,是對(duì)參數(shù)個(gè)數(shù)進(jìn)行驗(yàn)證的,可以pass掉

第二行代碼,調(diào)用了getSize()方法,并對(duì)getSize()返回結(jié)果直接進(jìn)行大小比較,問(wèn)題很有可能就出現(xiàn)在getSize()方法身上

我們看一下getSize()的代碼

getSize()

我們可以看到if里面判斷了如果值是數(shù)字類型并且$hasNumeric就直接返回原始值,如果返回原始值的話,validateMin()方法應(yīng)該會(huì)正確校驗(yàn),所以if條件應(yīng)該是不成立

原因很可能就在$hasNumeric這個(gè)變量上

$hasNumeric調(diào)用了$this->hasRule($attribute, $this->numericRules)方法,并傳了兩個(gè)參數(shù)過(guò)去

$attribute:當(dāng)前屬性名

$this->numericRules:["Numeric", "Integer"]

然后我們看一下$this->hasRule()方法究竟做了什么?

hasRule方法直接調(diào)用了$this->getRule()方法,并且將參數(shù)原封不動(dòng)傳遞過(guò)去

我們看一下getRule()方法干了什么?

getRule()

我們已知$attribute是當(dāng)前字段名,比如文章舉例用的字段group_num

$this->rules其實(shí)就是字段+校驗(yàn)規(guī)則拼裝的數(shù)組,格式如下:

既然第一個(gè)if語(yǔ)句的兩個(gè)變量都知道了,我們就能判斷出第一個(gè)條件是不成立的,我們繼續(xù)看接下來(lái)的代碼

代碼是對(duì)當(dāng)前需要校驗(yàn)字段的規(guī)則進(jìn)行遍歷,并且格式化

list($rule, $parameters) = $this->parseRule($rule);

假設(shè)是上圖中的group_num字段,他有3個(gè)校驗(yàn)規(guī)則,分別是:required、min、max

第一次循環(huán)$rule就是Required,$parameters為空

第二次循環(huán)$rule就是Min,$parameters就是[1]

我們會(huì)發(fā)現(xiàn)parseRule($rule)后,會(huì)對(duì)規(guī)則進(jìn)行in_array的判斷,$rules是參數(shù)(["Numeric", "Integer"])上文有寫

假設(shè)我們此時(shí)的字段是group_num:

第一個(gè)規(guī)則是required,條件不成立;

第二個(gè)規(guī)則是Min,條件依然不成立;

第三個(gè)規(guī)則是Max,條件還是不成立!

getRule()返回值:

條件都不成立,方法走完,沒有任何返回值,返回值為null

hasRule()返回值:

回到hasRule()方法,會(huì)對(duì)getRule()方法值進(jìn)行is_null(),并進(jìn)行邏輯非處理(!),所以返回值為false

我們接著回到getSize()方法,此時(shí)我們就知道$hasNumeric的值是false

所以下面的if條件都不成立,最后Laravel使用mb_strlen()對(duì)我們數(shù)字類型的值進(jìn)行了長(zhǎng)度計(jì)算?。?!

解決問(wèn)題

既然我們知道原因在于Laravel對(duì)當(dāng)前字段所有規(guī)則進(jìn)行了in_array($rule, ["Numeric", "Integer"])

所以解決思路就是,如果我們要對(duì)字段進(jìn)行大小進(jìn)行范圍校驗(yàn),我們需要把規(guī)則修改成:

"group_num" => "integer|min:1|max:21"

所以文章開頭的校驗(yàn),對(duì)于數(shù)值類型的字段,是錯(cuò)誤的!

其實(shí)這不是一個(gè)BUG,單純的是Laravel的校驗(yàn)機(jī)制,不過(guò)Laravel文檔寫的很模糊!

所以大家在開發(fā)的時(shí)候記得一定要認(rèn)真測(cè)試!

原文在自己的博客:Laravel一次單元測(cè)試發(fā)現(xiàn)的’BUG’,分析并解決問(wèn)題 - 木魚博客

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/28914.html

相關(guān)文章

  • input[type='file']在html5中打開文件選擇框緩慢問(wèn)題

    摘要:最近在項(xiàng)目中引用了一個(gè)新標(biāo)準(zhǔn)上傳附件的插件,使用過(guò)程中發(fā)現(xiàn)了一個(gè)很有意思也很頭疼的問(wèn)題,第一次點(diǎn)擊時(shí)瞬間就可以打開文件選擇框,之后再點(diǎn)擊則需要等待恐怖的以上備注使用的是瀏覽器版本這是核心部分代碼,經(jīng)過(guò)二次封裝的。 最近在項(xiàng)目中引用了一個(gè)html5新標(biāo)準(zhǔn)上傳附件的插件,使用過(guò)程中發(fā)現(xiàn)了一個(gè)很有意思也很頭疼的問(wèn)題,第一次點(diǎn)擊時(shí)瞬間就可以打開文件選擇框,之后再點(diǎn)擊則需要等待恐怖的8s以上(備...

    BenCHou 評(píng)論0 收藏0
  • JS 中為啥 ['1', '7', '11

    摘要:如果我們把非布爾值作為條件呢打開控制臺(tái)并運(yùn)行上述代碼,會(huì)打印說(shuō)明條件為真值。在中,真值指的是在布爾值上下文中轉(zhuǎn)換后的值為真的值。兩個(gè)能夠建立元素間一一對(duì)應(yīng)的集合稱為互相對(duì)等集合。 showImg(https://segmentfault.com/img/bVbtSvt?w=720&h=360); 為了保證可讀性,本文采用音譯而非直譯。 Javascript 一直是神奇的語(yǔ)言。 不相信我...

    yuanzhanghu 評(píng)論0 收藏0
  • Laravel】[錯(cuò)誤解決] 'Class AppConsoleKernel do

    摘要:今天用更改了的命名空間名字,然后又用恢復(fù)到了原來(lái)的命名空間名。結(jié)果直接導(dǎo)致以下錯(cuò)誤問(wèn)題解決確定你的引導(dǎo)程序沒問(wèn)題在項(xiàng)目根目錄執(zhí)行命令解決方案來(lái)自傳送門為什么要執(zhí)行,參考深入 今天用php artisan app:name 更改了app的命名空間名字,然后又用git恢復(fù)到了原來(lái)的App命名空間名。 結(jié)果直接導(dǎo)致以下錯(cuò)誤:Fatal error: Uncaught exception Re...

    chadLi 評(píng)論0 收藏0
  • ECharts xAxis.type='time'時(shí)間軸時(shí)卡頓問(wèn)題

    摘要:原文首發(fā)于我的個(gè)人網(wǎng)站卡頓問(wèn)題出現(xiàn)背景中主要耗能設(shè)置為折線圖軸數(shù)據(jù)量控件最開始軸為類目軸,最近根據(jù)情況想改為時(shí)間軸卡頓主要表現(xiàn)在顯示和拖動(dòng)時(shí)。初步分析是為導(dǎo)致,因?yàn)榍袚Q回后就卡頓問(wèn)題消失。 原文首發(fā)于我的個(gè)人網(wǎng)站: https://lonhon.top/ 卡頓問(wèn)題出現(xiàn)背景: ECharts^4.0.4 + Vue^2.5.9 option中主要耗能設(shè)置為:折線圖 + Y軸2 + se...

    happyhuangjinjin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

zhiwei

|高級(jí)講師

TA的文章

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