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




15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
發表第一個留言支持創作者!
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
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。
Thumbnail
Laravel框架中的路由系統是其核心功能之一,它允許開發者輕鬆地定義應用程式的URL結構和相應的邏輯。本篇文章將深入探討Laravel路由的基本概念、進階功能以及實際應用。
Thumbnail
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
Thumbnail
假如開發了一個部落格,以下是ERD設計: 接著從程式碼來看如何join: $this->article ->join('comments', 'article.article_id', '=', 'comments.article_id') ->select('article.article_i
Thumbnail
在開發過程中,難免會需要自己寫一些common function,例如Laravel 如何寫 Log這篇提到的,write log為了能夠顯示file name跟line,可以把它封裝成一個common function,以後要改log format也只需要從這邊改...
Thumbnail
Laravel的日誌系統底層是Monolog,設定在config\logging.php裡面,預設路徑是在storage\logs\laravel.log,也可以更改成喜歡的路徑。 ...
Thumbnail
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
待業中後,發現時間變很多就開始東看看西看看,思考著要如何更深入理解Laravel框架的運用,而在Laravel框架中哪些部分是框架替我們做了哪些處理,推薦一個影片給大家一起學習理解。
Thumbnail
Laravel框架中的路由系統是其核心功能之一,它允許開發者輕鬆地定義應用程式的URL結構和相應的邏輯。本篇文章將深入探討Laravel路由的基本概念、進階功能以及實際應用。
Thumbnail
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
Thumbnail
假如開發了一個部落格,以下是ERD設計: 接著從程式碼來看如何join: $this->article ->join('comments', 'article.article_id', '=', 'comments.article_id') ->select('article.article_i
Thumbnail
在開發過程中,難免會需要自己寫一些common function,例如Laravel 如何寫 Log這篇提到的,write log為了能夠顯示file name跟line,可以把它封裝成一個common function,以後要改log format也只需要從這邊改...
Thumbnail
Laravel的日誌系統底層是Monolog,設定在config\logging.php裡面,預設路徑是在storage\logs\laravel.log,也可以更改成喜歡的路徑。 ...