Laravel 內建 Boolean validation 不接受 'true', 'false'

更新於 發佈於 閱讀時間約 6 分鐘

最近在開發某一個項目功能,這也是先前同事踩到的坑,這次換我在踩一次,順便記錄一下,主要發生情境是,在執行GET參數,定義一個isDownlineSearch 布林判斷時,當前端傳入true or false,在執行以下程式碼判斷時會失敗,他無法正確判斷此值,$isDownlineSearch取得的value不管是true or false,皆認為ture,除非你輸入1 or 0

範例程式如下

$isDownlineSearch = $request->query->get('isDownlineSearch', true);

$whereColumn = 'uid';
if($isDownlineSearch){
$whereColumn = 'upperId';
}

當我傳入isDownlineSearch = false 時,正常不應該進入這個判斷式,我們試著將程式碼打印出來 var_dump($isDownlineSearch)看段程式碼結果,可以看到傳入值為字串string 的 false,而在PHP 中,當你使用 if 條件語句來測試一個字串(string)時,如果字串不為空,則 if 條件將被視為 true

raw-image

根據PHP執行結果,因為傳入是字串,故程式碼永遠判斷為 true 進而將whereColumn設定為'upperId',非我預期的結果'uid'。

後來查了類似情況,Laravel 對於boolean驗證,不接受true or false,但接受1 or 0,而在你編寫測試時,當你設定傳入參數$isDownlineSearch = true,跑測試結果時,$isDownlineSearch 會變成 1 ,所以預期測試情況下都會是測試正常結果,但上線時就會出問題XDDDD

即使你將程式碼改為下列的判斷式,但測試執行的$isDownlineSearch 會變成 1,這段程式碼又會不成立,因為嚴格比較運算符 === 表示不僅要比較值,還要比較數據類型是否相同,所以if (1 === true) 的結果是 false,因為整數 1 和布林值 true 的數據類型不相同。

$whereColumn = 'uid';
if($isDownlineSearch === true ){
$whereColumn = 'upperId';
}

那你一定會想說那我改成非嚴格比較運算符 == ,這樣就行了吧,但這段解決了測試,卻沒解決先前的if(string) 總是等於true的情況

$whereColumn = 'uid';
if($isDownlineSearch == true ){
$whereColumn = 'upperId';
}

查看 laravel 類似案例後,解法可以使用PHP filter_var 這個方法

filter_var($value, FILTER_VALIDATE_BOOLEAN);
raw-image

當你使用這個過濾方式,將取得字串的 true or false 轉換為 boolean值

$isDownlineSearch = $request->query->get('isDownlineSearch', true);
$isDownlineSearch = filter_var($isDownlineSearch, FILTER_VALIDATE_BOOLEAN);

我們把他 var_dump($isDownlineSearch); 出來看一下,可以看到傳入值已經被轉為布林值,底下的if判斷也能正常執行了

raw-image

Boolean Rule 通用規則

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Boolean implements Rule
{
/** * laravel 內建 Boolean validation 不接受 'true', 'false' * 參考 https://github.com/laravel/ideas/issues/514 * * @param string $attribute * @param mixed $value * @return bool */
public function passes($attribute, $value)
{
if (is_bool($value)) {
return true;
}

if (in_array($value, ['true', 'false', '1', '0', 1, 0], true)) {
return true;
}

return false;
}

/** * Get the validation error message. * * @return string */
public function message()
{
return trans('validation.custom.boolean');
}
}


以上就是今天踩的坑,筆記一下以免時間一久就忘記了。

github issues 參考

https://github.com/laravel/ideas/issues/514

filter_var 參考

https://www.php.net/manual/zh/function.filter-var.php




留言
avatar-img
留言分享你的想法!
avatar-img
DDDDD的沙龍
15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
DDDDD的沙龍的其他內容
2023/12/13
待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。
Thumbnail
2023/12/13
待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。
Thumbnail
2023/12/09
現在AI工具太多,且框架對於資安支援及處理也越來越方便,反而開始會容易忽略最底層的知識,這邊回顧MySQL的鎖,順便記錄一下找到的一些影片資源,並整理筆記
Thumbnail
2023/12/09
現在AI工具太多,且框架對於資安支援及處理也越來越方便,反而開始會容易忽略最底層的知識,這邊回顧MySQL的鎖,順便記錄一下找到的一些影片資源,並整理筆記
Thumbnail
2023/12/05
這邊主要是遇到功能需要處理時區,雖然主管給的筆記已經寫得很完美了,但覺得還是得理解吸收後並記錄自己的筆記後,好像才能有效吸收到腦袋裡
Thumbnail
2023/12/05
這邊主要是遇到功能需要處理時區,雖然主管給的筆記已經寫得很完美了,但覺得還是得理解吸收後並記錄自己的筆記後,好像才能有效吸收到腦袋裡
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
題目會給定一個字串s,裡面都是由()*打散交錯而成。 配對規則 左括弧 ( 可以和 右括弧 ) 配對,其中 左括弧一定要在右括弧的左邊。 左括弧 ( 也可以和 *星號 配對,其中 左括弧一定要在*星號的左邊。 問我們給定的輸入字串s是否為合法括弧配對字串?
Thumbnail
題目會給定一個字串s,裡面都是由()*打散交錯而成。 配對規則 左括弧 ( 可以和 右括弧 ) 配對,其中 左括弧一定要在右括弧的左邊。 左括弧 ( 也可以和 *星號 配對,其中 左括弧一定要在*星號的左邊。 問我們給定的輸入字串s是否為合法括弧配對字串?
Thumbnail
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s 是不是合法括弧自串,也就是所有的右括弧都在左括弧後面,而且可以兩兩相消。
Thumbnail
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s 是不是合法括弧自串,也就是所有的右括弧都在左括弧後面,而且可以兩兩相消。
Thumbnail
題目:完成解決方案,當第一個參數(String 型別)以第二個參數結尾時(也是 String 型別)返回 true。
Thumbnail
題目:完成解決方案,當第一個參數(String 型別)以第二個參數結尾時(也是 String 型別)返回 true。
Thumbnail
最近在開發某一個項目功能,這也是先前同事踩到的坑,這次換我在踩一次,順便記錄一下,主要發生情境是,在執行GET參數,定義一個isDownlineSearch 布林判斷時,前端傳入true or false,在執行以下程式碼判斷時會失敗,他無法正確判斷此值。
Thumbnail
最近在開發某一個項目功能,這也是先前同事踩到的坑,這次換我在踩一次,順便記錄一下,主要發生情境是,在執行GET參數,定義一個isDownlineSearch 布林判斷時,前端傳入true or false,在執行以下程式碼判斷時會失敗,他無法正確判斷此值。
Thumbnail
題目:建立一個傳回值乘以 50 並增加 6 的函數。如果輸入的值是字串,則應傳回「Error」。
Thumbnail
題目:建立一個傳回值乘以 50 並增加 6 的函數。如果輸入的值是字串,則應傳回「Error」。
Thumbnail
Valid Parentheses : 確認input的括號是否符合成雙成對的規則,符合回傳true,否則回傳false.
Thumbnail
Valid Parentheses : 確認input的括號是否符合成雙成對的規則,符合回傳true,否則回傳false.
Thumbnail
看到了一段程式碼,一段乍看之下覺得挺詭異,懷疑是不是寫錯,但搞清楚之後卻拍案叫絕,冷靜下來後卻覺得這樣寫不怎麼好的程式碼。
Thumbnail
看到了一段程式碼,一段乍看之下覺得挺詭異,懷疑是不是寫錯,但搞清楚之後卻拍案叫絕,冷靜下來後卻覺得這樣寫不怎麼好的程式碼。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News