web-dev-qa-db-ja.com

Laravel 5:4つの入力フィールドからの日時入力を検証する方法は?

締め切りを含むフォームがあり、ユーザーは次のように4つの入力フィールドに締め切りを設定する必要があります。

<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では、これらの4つのフィールドを締め切りにコンパイルしています。だから私の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パッケージには、php checkdateとまったく同じように機能するcheckdateメソッドがあります。このformRequestの日付をどこでどのように検証して、有効な日付を選択するようにユーザーに通知できますか?実際、期限がprepInputに渡される前に、この検証を行う必要があります。

11
Ali Erfani

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メソッドを簡略化することもできます。基本的には同じです。

13
benJ