"required|in:visa,ma-6ren">
gpt4 book ai didi

php - Laravel 验证 - 日期格式 m/y 不接受特定值

转载 作者:搜寻专家 更新时间:2023-10-31 21:47:39 26 4
gpt4 key购买 nike

我有以下用于支付方式基本身份验证的验证规则(高级内容,如 CVD 验证、现有卡等由 Moneris 处理)。

$rules = [
"type" => "required|in:visa,mastercard",
"nickname" => "required",
"credit_card_number" => "required|numeric|digits:16",
"expiry" => "required|string|size:5|date_format:m/y|after:today",
"cvd" => "required|numeric|digits:3"
];

expiry 规则不接受特定值 04/yy,但它接受 03/yy05/年;我不知道为什么会这样,但我需要补救。有没有人遇到过这种行为?

作为引用,结果 dd($request->input(), $validator->passes(), $validator->errors()); 当我通过 04/19如下:

array:6 [▼
"type" => "visa"
"nickname" => "Testing"
"credit_card_number" => "4242424242424242"
"expiry" => "04/19"
"cvd" => "123"
"masked_pan" => "************4242"
]
false
MessageBag {#502 ▼
#messages: array:1 [▼
"expiry" => array:1 [▼
0 => "The expiry does not match the format m/y."
]
]
#format: ":message"
}

当我发送 05/19 时,一切正常:

array:6 [▼
"type" => "visa"
"nickname" => "Testing"
"credit_card_number" => "4242424242424242"
"expiry" => "05/19"
"cvd" => "123"
"masked_pan" => "************4242"
]
true
MessageBag {#502 ▼
#messages: []
#format: ":message"
}

最佳答案

看起来这个验证规则在 Laravel 5.4 中的工作方式存在问题。为了解决这个问题,我检查了以 01/ 为前缀的输入的日期有效性,如果有效,则将其合并到请求中,并使用 endOfMonth() 来处理 之后:今天 验证:

$mergeDate = null;
$rawInput = $request->input("expiry");
try {
$mergeDate = Carbon::createFromFormat("d/m/y", "01/".$request->input("expiry"))->endOfMonth();
} catch(\Exception $ex){}

$request->merge([
"masked_pan" => str_repeat("*", 12).substr($request->input("credit_card_number", ""), -4),
"expiry" => $mergeDate ? $mergeDate->format("d/m/y") : $request->input("expiry")
]);

所以现在,如果我通过 04/22,它将检查 01/04/22 是否有效,然后转换为月底 30/04/22,然后将其替换为传递给验证的值(也需要更新)

"expiry" => "required|string|size:8|date_format:d/m/y|after:today",

我还必须更新并传递 $messages 以避免混淆用户:

$messages = [
"expiry.size" => "The :attribute filed must be 5 characters.",
"expiry.date_format" => "The :attribute field does not match the format m/y"
];

$validator = \Validator::make($request->all(), $rules, $messages);

最后,如果出现错误,则用原始输入替换该值(这样用户就看不到他们没有输入的值)

if(!$validator->passes()){
$request->merge(["expiry" => $rawInput]);
return back()->withErrors($validator)->withInput();
}

一大堆废话,但似乎可以很好地处理 04/22 和其他日期。

关于php - Laravel 验证 - 日期格式 m/y 不接受特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54467445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com