提问人:TKoL 提问时间:11/2/2023 更新时间:11/6/2023 访问量:63
字符串“today”的 Laravel 日期验证错误
Laravel date validation erroring for string "today"
问:
我正在对日期字段使用laravel验证,如下所示:
Validator::make($shipment, [
'collection_date' => 'required|date',
...
我正在发送带有此字段的 json:
"collection_date": "today",
它给出了这个错误:
{
"collection_date": [
"The collection date is not a valid date."
]
}
现在,你可能会说 DUH,这不是一个有效的日期字符串,但问题是:
我能找到的每一个解释 “date” 验证器在 Laravel 中如何工作的来源都说它使用了 PHP 的内部 strtotime 函数。 吐出与今天对应的时间戳(具体来说,今天早上 00:00)。既然如此,“今天”应该被 laravel 视为一个有效的“日期”,不是吗?strtotime("today")
答:
0赞
Wolf_Developer
11/2/2023
#1
验证器将 json 中发送的“today”视为字符串,而不是验证日期格式。 使用日期规则时,Laravel 希望字段值采用直接表示日期的格式,例如“Y-m-d”(例如,“2023-10-31”)或“m/d/Y”(例如,“10/31/2023”)。虽然 PHP 的 strtotime 函数是宽容的,并且可以正确解释“今天”,但 Laravel 的日期规则并不将此类字符串表示视为有效的日期格式。
"collection_date": "2023-10-31",
评论
0赞
TKoL
11/2/2023
那么,为什么网上所有这些地方都说拉拉维尔的日期规则从字面上使用“strtotime”来检查它是否是有效的日期呢?这不对吗?laravel 的日期规则用于验证日期格式?
0赞
Wolf_Developer
11/2/2023
Laravel日期验证规则主要依靠PHP的strtotime函数来验证日期字符串。它应该检查给定的字符串是否可以被 PHP 解释为有效日期。但是,strtotime 解释“今天”或其他相对时间字符串的方式以及 Laravel 日期规则解释它们的方式可能存在不一致或差异。
0赞
TKoL
11/2/2023
如果存在不一致,那么就不能只是 Laravel 的日期规则使用 strtotime 的情况 - 它必须做一些不同的事情,或者除了 strtotime 之外。所以。。。这是什么?“日期”验证者在做什么?
-2赞
nidhinnp
11/2/2023
#2
$jsonData = [
[
'collection_date' => Carbon::now()->format('Y-m-d'),
],
// Add more data as needed
];
1赞
Othmane Nemli
11/2/2023
#3
Laravel使用parse_date()引擎盖下没有使用strtotime()功能 有关详细信息,可以查看 validateDate 函数 如果你想使用你的规则,你可以这样做
$validator = Validator::make($shipment, [
'collection_date' => [
'required',
function (string $attribute, mixed $value, Closure $fail) {
if (strtotime($value) === false) {
$fail("The {$attribute} is invalid.");
}
},
],
])
或者,您可以进行自己的规则验证
如果您对日期规则不满意,可以通过扩展验证器来覆盖它
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Validator::extend('date', function ($attribute, $value, $parameters, $validator) {
return !!strtotime($value);
});
}
}
// Then
$validator = Validator::make($shipment, [
'collection_date' => [
'required',
'date'
],
])
评论
1赞
TKoL
11/2/2023
感谢您提供 validateDate 的链接,我明白现在发生了什么。它在一个阶段使用了 strtotime,但它也使用了 然后使用的函数——所以“今天”失败的原因是因为没有成功。谢谢。$date = date_parse($value);
checkdate
date_parse('today')
评论