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

Posted

技术标签:

【中文标题】Laravel 验证 – 日期格式 m/y 不接受特定值【英文标题】:Laravel Validation – Date Format m/y Not Accepting Specific Value 【发布时间】:2019-06-25 07:39:37 【问题描述】:

对于支付方式的基本身份验证,我有以下验证规则(高级事物,如 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/yy;我不知道为什么会这样,但我需要纠正它。有没有人遇到过这种行为?

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

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?可能与此有关:github.com/laravel/framework/issues/21467 查看一些线程,我看到用户在date_format:"m/y" 周围加上引号,就像这里:laracasts.com/discuss/channels/laravel/date-format-validation 有什么改变吗? 对不起,Laravel 5.4 是版本。我会试试那个杰夫;看看有没有什么不同。 @Jeff 如果我这样做date_format:\"y/m\",它会将其视为相同。如果我使用单引号,05/19 会失败。如果我交换引号,它仍然会失败。我不认为是这样。 【参考方案1】:

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

$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和其他日期就好了。

【讨论】:

以上是关于Laravel 验证 – 日期格式 m/y 不接受特定值的主要内容,如果未能解决你的问题,请参考以下文章

之后:日期不接受 Laravel 表单验证中的相同日期?

验证模型表单日期字段时,Django 期望格式错误

更改 laravel 视图页面中的日期格式

Chrome 不接受使用 jQuery 验证的特定日期格式

在 Laravel 请求中验证 Bootstrap 日期时间选择器

Laravel如何更改列表中的日期格式