laravel 校驗規則 Rule::in 等對中文字元不友好的問題

Diego_crazy發表於2022-02-14

這個問題應該很多小夥伴都遇到過。記得以前處理過,然而時間太久忘記了,今天又遇到索性就記錄一下。
問題發現:

    /**
     * Test Rule::in
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function index(Request $request)
    {
        if ($error = HttpService::validate($request->all(), [
            'sex' => 'required|string|in:男,女',
        ])) {
            return HttpService::success($error);
        }

        //...

        return HttpService::success('OK');
    }

會發現,無論你 sex 傳 “男”還是”女”都提示是無效的。仔細檢查下程式碼,並無問題。為什麼過不了校驗,?來看看 Validator 到底做了什麼吧。
程式碼追溯:

laravel 校驗規則 Rule::in 等對中文字元不友好的問題

laravel 校驗規則 Rule::in 等對中文字元不友好的問題

laravel 校驗規則 Rule::in 等對中文字元不友好的問題

laravel 校驗規則 Rule::in 等對中文字元不友好的問題

直到看到這裡就基本明白了, 畢竟這個坑以前解決過。函式:str_getcsv(), 說明:以 CSV 欄位格式解析字串輸入,並返回包含讀取欄位的陣列,更多參考PHP手冊。
測試函式 str_getcsv() 對中文字元的支援, php artisan tinker:

        $strArr = ['男,女', '男男,女女', '男男,女女女', '女女女,男男'];
        foreach ($strArr as $str) {
            dump(str_getcsv($str));

            $str = iconv("UTF-8", "GBK", $str);
            $arr = str_getcsv($str);
            foreach ($arr as $k => $v) {
                $arr[$k] = iconv('GBK', 'UTF-8', $v);
            }
            dump($arr);
        }

執行結果是不一致,我的php版本是7.4.1。建議感興趣的多測試幾個php版本,估計會有更多收穫。

解決方法:

return str_getcsv($parameter);    //改:return explode(',', $parameter);

或者你也可以對 str_getcsv() 進行字元編碼處理,具體程式碼見上測試程式碼。
PS:原則問題,請勿在vendor依賴庫檔案進行修改。請使用:php artisan make:rule strIn

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章