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
15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
DDDDD的沙龍 的其他內容
最近因為想要花些時間做完一個完整的SideProject,以前總是懂得怎麼使用,拼拼湊湊完成一個塞趴卷就交卷了,但都沒時間去真正理解這些原理的應用,而Laravel 框架本身支持的登入登出的工具,就有好多種。
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
練習 PHPUnit 測試的撰寫,依序創建Controller、Service,並針對計算邏輯進行單元測試的練習。
在 Laravel 中的測試中,PHPUnit 和 Mockery 都可以用來創建測試替身(test double),但它們有不同的方式和功能,以下簡單介紹兩種寫法方式。
最近在研讀單元測試的藝術這本書,也剛好因為自己對單元測試的撰寫還沒有很游刃有餘XD,但由於我是挑重點看,簡單做個內容讀後感的整理
接續上一章Laravel Request 的概念簡單說明,接下來講 Request 特別的應用,而分享這部分的契機,主要是在新人時期面試時被問到的一題,不知道大家是否有被考過這題? 通常考官的問題:解釋一下關於Laravel 隱式綁定 or 是否聽過隱式綁定?
最近因為想要花些時間做完一個完整的SideProject,以前總是懂得怎麼使用,拼拼湊湊完成一個塞趴卷就交卷了,但都沒時間去真正理解這些原理的應用,而Laravel 框架本身支持的登入登出的工具,就有好多種。
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
練習 PHPUnit 測試的撰寫,依序創建Controller、Service,並針對計算邏輯進行單元測試的練習。
在 Laravel 中的測試中,PHPUnit 和 Mockery 都可以用來創建測試替身(test double),但它們有不同的方式和功能,以下簡單介紹兩種寫法方式。
最近在研讀單元測試的藝術這本書,也剛好因為自己對單元測試的撰寫還沒有很游刃有餘XD,但由於我是挑重點看,簡單做個內容讀後感的整理
接續上一章Laravel Request 的概念簡單說明,接下來講 Request 特別的應用,而分享這部分的契機,主要是在新人時期面試時被問到的一題,不知道大家是否有被考過這題? 通常考官的問題:解釋一下關於Laravel 隱式綁定 or 是否聽過隱式綁定?
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
在檢查列表中含有tuple的座標點時,若要給其他演算法做運算時若有其中有tuple有空值時,就會報錯。 本文主要介紹兩種方法可以檢查是否有空值 程式範例1 positon_list =[(42,123),(None,None),(22,11)] for cord in positon_lis
Thumbnail
在這一章中,我們介紹了PHP中的流程控制語句,包括if、else if、else、三元運算子、switch語句、for迴圈、foreach迴圈、while迴圈、do-while迴圈、循環嵌套以及控制迴圈的語句如break、continue、goto和return。
Thumbnail
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
問題 Write a function expect that helps developers test their code. It should take in any value val and return an object with the following two functio
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
Thumbnail
題目敘述 題目會給我們兩個輸入,字串s和字串t,要求我們判定s是否為t的子序列(Subsequence)? 題目的原文敘述 測試範例 Example 1: Input: s = "abc", t = "ahbgdc" Output: true Example 2: Input:
Thumbnail
🎗️布林邏輯 布林邏輯在EXCEL中扮演一個超級重要的角色,其實是兩個角色才對,一個叫做TRUE、一個叫做FALSE。 那TRUE跟FALSE代表什麼意思,又有什麼意義呢? TRUE英文翻譯是真,在布林邏輯上則是成立的意思 FALSE英文翻譯為假,在布林邏輯上則是不成立的意思 TRUE
發送表單用get跟post看起來好像都無所謂,然而事實並非如此,使用GET的風險如下: 安全性問題 機密資訊為何不宜用GET,是因為由GET方法提交的表單會將欄位的key,value顯示於URL上,想像一下如果小明借用你的電腦,查看你的網頁歷史紀錄時就可以看到你的帳密了,多可怕! 再來就是如果
Thumbnail
IF,Switch,三元運算子語法說明 IF條件選擇結構說明 IF為布林條件,當()內條件式滿足True執行if區塊的程式碼,不滿足則執行else區塊的程式碼,若無else也行。
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
在檢查列表中含有tuple的座標點時,若要給其他演算法做運算時若有其中有tuple有空值時,就會報錯。 本文主要介紹兩種方法可以檢查是否有空值 程式範例1 positon_list =[(42,123),(None,None),(22,11)] for cord in positon_lis
Thumbnail
在這一章中,我們介紹了PHP中的流程控制語句,包括if、else if、else、三元運算子、switch語句、for迴圈、foreach迴圈、while迴圈、do-while迴圈、循環嵌套以及控制迴圈的語句如break、continue、goto和return。
Thumbnail
當我們在做很多處理時,結果可能會是List包住一些數值,例如找輪廓或連通域分析時,沒有剛好的特徵可能就會有List含(空值得)形式出現。 為了避免報錯,我們就要額外先做一些處理,先做判斷是否有值在往下一個階段。 all 和 any 是 Python 中用於檢查可迭代物件(如清單、元組、集合等)
問題 Write a function expect that helps developers test their code. It should take in any value val and return an object with the following two functio
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
Thumbnail
題目敘述 題目會給我們兩個輸入,字串s和字串t,要求我們判定s是否為t的子序列(Subsequence)? 題目的原文敘述 測試範例 Example 1: Input: s = "abc", t = "ahbgdc" Output: true Example 2: Input:
Thumbnail
🎗️布林邏輯 布林邏輯在EXCEL中扮演一個超級重要的角色,其實是兩個角色才對,一個叫做TRUE、一個叫做FALSE。 那TRUE跟FALSE代表什麼意思,又有什麼意義呢? TRUE英文翻譯是真,在布林邏輯上則是成立的意思 FALSE英文翻譯為假,在布林邏輯上則是不成立的意思 TRUE
發送表單用get跟post看起來好像都無所謂,然而事實並非如此,使用GET的風險如下: 安全性問題 機密資訊為何不宜用GET,是因為由GET方法提交的表單會將欄位的key,value顯示於URL上,想像一下如果小明借用你的電腦,查看你的網頁歷史紀錄時就可以看到你的帳密了,多可怕! 再來就是如果
Thumbnail
IF,Switch,三元運算子語法說明 IF條件選擇結構說明 IF為布林條件,當()內條件式滿足True執行if區塊的程式碼,不滿足則執行else區塊的程式碼,若無else也行。