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

Posted

技术标签:

【中文标题】在 Laravel 请求中验证 Bootstrap 日期时间选择器【英文标题】:Validating Bootstrap date-time picker in Laravel request 【发布时间】:2018-04-30 00:33:12 【问题描述】:

我正在使用 Bootstrap 日期时间选择器,我正在尝试验证控制器中的日期,但它总是给我一个错误,说格式不正确!。

但是我可以从请求数据创建一个新的 Carbon 日期对象,但我无法使用相同的格式验证请求对象。

这会引发一个错误,指出 from 与格式不匹配 d M Y - H:i

$request->validate([
            'from' => 'date_format:"d M Y - H:i"|required|before:till',
            'till' => 'date_format:"d M Y - H:i"|required|after:from'
    ]);

但是,如果我在没有任何验证的情况下使用数据,则此代码有效。

$ride->from = Carbon::createFromFormat('d M Y - H:i', $request->from)->toDateTimeString();
$ride->till = Carbon::createFromFormat('d M Y - H:i', $request->till)->toDateTimeString();

注意: 引导 dateTimePicker 有 format: "dd MM yyyy - hh:ii" 但我理解 javascript 格式不同于 php 格式。

这里出了什么问题?

编辑:这些是从转储请求对象获得的输入日期。

  "from" => "16 November 2017 - 14:10"
  "till" => "06 November 2017 - 12:00"

【问题讨论】:

显示传递给验证器的输入日期。 @LeszekRepie 添加,请查看编辑 用这种格式在php中显示日期时间并检查是否相同。您应该会看到“2017 年 11 月 15 日 - 15:40”(时间会有所不同) 【参考方案1】:

因为使用beforeafter 作为日期是去strtotime 来检查doc 中的检查

16 Nov 2017 - 12:10 是无效日期检查not valid date 删除后还要检查- valid date

所以我建议你这样转换

$from = str_replace("-","",$request->from);
$to = str_replace("-","",$request->to);
$request->validate([
        'from' => 'date_format:"d M Y - H:i"|required|before:'.$to,
        'till' => 'date_format:"d M Y - H:i"|required|after:'.$from
]);

【讨论】:

我尝试了您的解决方案,但仍然出现错误。 The from does not match the format d M Y - H:i. The till does not match the format d M Y - H:i. 可能是till 我把to 用你的数据试试till【参考方案2】:

说实话,您不需要注意日期格式。完全没有必要。我建议你这样做:

$fromDate = Carbon::parse($request->get('from'));
$toDate = Carbon::parse($request->get('to'));

现在上面将允许您比较以下条件的日期:

检查您是否已过了有效日期。 开始日期不应早于当前日期。 截止日期不应早于开始日期。

然后你可以这样做:

if (($startDate === false) || ($toDate === false)) 
    // return error


// Check start date is greater than to date
if ($startDate->gt($toDate)) 


// Check to date is not less than to date
if ($toDate->lt($toDate)) 
    

只要您以正确的格式传递日期,这就足够了。无需对日期格式进行验证。

【讨论】:

我知道我可以在验证方法之外做到这一点,但这违背了目的,我主要想检查beforeafter 条件。验证提供了更好、更优雅的解决方案,而不是使用 if else 循环。 是的。但有时需要即时构建验证规则。

以上是关于在 Laravel 请求中验证 Bootstrap 日期时间选择器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel Collective、Bootstrap 模型和 JavaScript 的客户端表单验证和路由?

在 Laravel 5 中使用表单请求验证时如何添加自定义验证规则

在 laravel 表单请求验证中验证数组对象?

laravel :在验证之前清理请求数据

单击laravel vuejs中的按钮后如何隐藏bootstrap-vue模式

Laravel 请求在验证失败时不返回修改后的请求