Laravel 5:如何从4个输入字段验证日期时间输入?

时间:2015-07-27 07:38:11

标签: php validation datetime laravel-5

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

<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完全相同。我在何处以及如何验证此表格中的日期请求并通知用户选择有效日期? 事实上,我需要在截止日期传递到prepInput之前进行此验证。

2 个答案:

答案 0 :(得分:11)

Laravel的Validator有一个date_format规则,因此在表单请求中设置规则时,您应该只需添加以下内容:

def mii(strlist):
    word={}
    index={}
    for str in strlist:
        for str2 in str.split():
            if str2 in word==False:
                word.add(str2)
                i={}
                for (n,m) in list(enumerate(strlist)):
                    k=m.split()
                    if str2 in k:
                        i.add(n)
                index.add(i)
    return { x:y for (x,y) in zip(word,index)}

然后在你看来:

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

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

答案 1 :(得分:-3)

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