【问题标题】:Laravel 5: How to validate datetime input from 4 input fields?Laravel 5:如何验证来自 4 个输入字段的日期时间输入?
【发布时间】:2015-10-17 07:16:44
【问题描述】:

我有一个包含截止日期的表单,用户应该在四个输入字段中设置截止日期,如下所示:

<div class="form-group col-lg-3">
    {!! Form::label('year', 'Year', ['class' => 'control-label']) !!}
    {!! Form::selectYear('year',$year, $year +1, null , ['class' => 'form-control']) !!}
</div>
<div class="form-group col-lg-3">
    {!! Form::label('month', 'Month', ['class' => 'control-label']) !!}
    {!! Form::selectRange('month', 1, 12 , null , ['class' => 'form-control']) !!}
</div>
<div class=" form-group col-lg-3">
    {!! Form::label('day', 'Day', ['class' => 'control-label']) !!}
    {!! Form::selectRange('day', 1, 31 , null , ['class' => 'form-control']) !!}
</div>
<div class=" form-group col-lg-3">
    {!! Form::label('hour', 'Hour', ['class' => 'control-label']) !!}
    {!! Form::selectRange('hour', 6, 23 , null , ['class' => 'form-control']) !!}
</div>

在 formRequest 中,我将这四个字段编译为截止日期。所以我的formRequest是这样的:

public function rules()
    {
        $this->prepInput();
        return [

        ];
    }
    public function prepInput(){
        $input=$this->all();
        ...
        $input['deadline']=$this->prepDeadline($input['hour'], $input['month'], $input['day'], $input['year']);
        ...
        $this->replace($input);
    }


    public function prepDeadline($hour,$month,$day, $year){

            $time = jDateTime::mktime($hour, 0, 0, $month, $day, $year);
            return $deadline = strftime("%Y-%m-%d %H:%M:%S", $time);        
    }

截止日期是 Jalali 日期时间,我需要检查用户是否选择了有效日期(例如 1394/12/31 不是有效日期)。 jDatetime 包有一个 checkdate 方法,其工作方式与 php checkdate 完全相同。我在哪里以及如何验证此 formRequest 中的日期并通知用户选择有效日期? 事实上,我需要在截止日期传递给 prepInput 之前进行此验证。

【问题讨论】:

    标签: php validation datetime laravel-5


    【解决方案1】:

    为了解决这个问题,我需要一个中间件来验证日期,我在 Laracasts 上找到了解决方案 详细信息可以在那里找到。

    【讨论】:

    • 仅链接答案不被认为是好的做法,您应该在答案本身中举例说明。
    【解决方案2】:

    Laravel 的 Validator 有一个 date_format 规则,所以在表单请求中设置规则时,应该可以简单的添加如下内容:

    public function rules()
    {
        $this->prepInput();
        return [
            'deadline' => 'date_format:Y-m-d H:i:s'
        ];
    }
    

    那么在你看来:

    @if ($errors->has('deadline'))
        {{ $errors->first('deadline') }}
    @endif
    

    您还可以通过简单地将年/月/日/小时连接成一个字符串来创建截止日期来简化您的 prepInput 方法;本质上是一样的。

    【讨论】:

    • 感谢您的回答。我已经尝试过了,它不会起作用,因为它不会检查用户是否提供了无效日期,并且无效日期将转换为有效日期并通过验证!
    • 您是否尝试过只创建一个字符串并对其进行验证,而不是使用 strftime?可能是 jDateTime 类将其转换为有效日期?我有一个快速测试和一个简单的连接日期,使用表单输入,如果确实无效,验证将失败!
    • 是的,jDateTime 有一个小问题,并且 checkdate 方法不起作用。我解决了这个问题,但主要问题仍然存在。我在 Laracasts 中提出了我的问题,他们帮助了我。
    • @KiranReddy 您只需将 H 更改为 h
    猜你喜欢
    • 2015-09-01
    • 1970-01-01
    • 2017-11-21
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多