Laravel 日期验证字符串“today”出错

问题描述 投票:0回答:3

我正在使用 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 视为有效的“日期”,不是吗?

php laravel datetime laravel-validation
3个回答
1
投票

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'
    ],
])


0
投票

验证器将 json 中发送的“今天”视为字符串,而不是验证日期格式。 使用日期规则时,Laravel 希望字段值采用直接表示日期的格式,例如“Y-m-d”(例如“2023-10-31”)或“m/d/Y”(例如“ 2023 年 10 月 31 日”)。虽然 PHP 的 strtotime 函数是宽容的并正确解释“今天”,但 Laravel 的日期规则并不将此类字符串表示视为有效的日期格式。

"collection_date": "2023-10-31",

-2
投票
$jsonData = [
    [
        'collection_date' => Carbon::now()->format('Y-m-d'),
    ],

    // Add more data as needed
];
© www.soinside.com 2019 - 2024. All rights reserved.