我正在使用 Laravel 验证日期字段,如下所示:
Validator::make($shipment, [
'collection_date' => 'required|date',
...
我正在发送带有此字段的 json:
"collection_date": "today",
它给出了这个错误:
{
"collection_date": [
"The collection date is not a valid date."
]
}
现在,您可能会说,这不是有效的日期字符串,但问题是这样的:
我能找到的所有解释 Laravel 中“日期”验证器如何工作的资料都说它使用 PHP 的内部 strtotime 函数。
strtotime("today")
输出与今天相对应的时间戳(具体来说,今天早上 00:00)。既然如此,“今天”应该被 laravel 视为有效的“日期”,不是吗?
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'
],
])
验证器将 json 中发送的“今天”视为字符串,而不是验证日期格式。 使用日期规则时,Laravel 希望字段值采用直接表示日期的格式,例如“Y-m-d”(例如“2023-10-31”)或“m/d/Y”(例如“ 2023 年 10 月 31 日”)。虽然 PHP 的 strtotime 函数是宽容的并正确解释“今天”,但 Laravel 的日期规则并不将此类字符串表示视为有效的日期格式。
"collection_date": "2023-10-31",
$jsonData = [
[
'collection_date' => Carbon::now()->format('Y-m-d'),
],
// Add more data as needed
];