這個問題應該很多小夥伴都遇到過。記得以前處理過,然而時間太久忘記了,今天又遇到索性就記錄一下。
問題發現:
/**
* 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 到底做了什麼吧。
程式碼追溯:
直到看到這裡就基本明白了, 畢竟這個坑以前解決過。函式: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 協議》,轉載必須註明作者和本文連結