Laravel 入力フォームが時間・分に別れている時の未来判定バリデーション

– 入力フィールドが時間・分に別れている時に、「終了時間が開始時間より未来」のバリデーションルール作成方法
— どこで時間と分を結合してバリデーションをかけるか? 

*.blade.php

<tr>
                    <th>開始時刻 <span class="badge badge-danger">必須</span></th>
                    <td>
                        <div class="form-inline">
                                {!! Form::select('start_H', $hours, 10, ['class' => 'form-control']) !!}
                                <span class="unit">時</span>
                                {!! Form::select('start_i', $minutes, 1, ['class' => 'form-control']) !!}
                                <span class="unit">分</span>
                        </div>
                    </td>
                </tr>
                <tr>
                    <th>終了時刻 <span class="badge badge-danger">必須</span></th>
                    <td>
                        <div class="form-inline">
                                {!! Form::select('end_H', $hours, 19, ['class' => 'form-control']) !!}
                                <span class="unit">時</span>
                                {!! Form::select('end_i', $minutes, 1, ['class' => 'form-control']) !!}
                                <span class="unit">分</span>
                        </div>
                        @error('end')
                                <span class="error">{{$message}}</span>
                        @enderror
                    </td>
                </tr>

### controller
コントローラーでunix timeを計算し、「終了時間」-「開始時間」 <= 0 の時、withErrorsでエラーメッセージと一緒にredirect backする [php] public function confirm(CustomeRequest $request){ $inputs = $request->all();
$start = $inputs[‘start_H’] . ‘:’ . $inputs[‘remote_start_i’] . ‘:00’;
$end = $inputs[‘end_H’] . ‘:’ . $inputs[‘remote_end_i’] . ‘:00’;
if((strtotime($end) – strtotime($start)) <= 0) { return redirect()->back()->withInput()->withErrors(array(‘end’ => ‘終了時刻は、開始時刻より未来を設定してください’));
}
[/php]

フォームリクエストやカスタムリクエストは、attribute、バリデーション処理、エラーメッセージが対になっているので、コントローラー側で処理をした。

laravel 6.x nullableなフォームのカスタムバリデーションの作り方

– 電話番号のフォームに入力があった場合、電話番号のバリデーションをかけたい

/^(([0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4})|([0-9]{8,11})$/

– 未入力の場合はバリデーションをパスする

カスタムバリデーション公式ドキュメント: https://readouble.com/laravel/6.x/ja/validation.html#custom-validation-rules

$ php artisan make:rule PhoneRule

./app/Rules/PhoneRule.php
入力値がなかった場合は、tureを返す

 public function passes($attribute, $value)
    {
        if($value){
            return preg_match('/^(([0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4})|([0-9]{8,11}))$/', $value);
        } else {
            return true;
        }       
    }
    public function message()
    {
        return trans('validation.phone');
    }

./app/Http/Requests/CreateUserRequest.php

use App\Rules\PhoneRule;
public function rules()
    {
        return [
            'phone' => [new PhoneRule],
        ];
    }

./resources/lang/ja/validation.php

'phone' => ':attributeはハイフン有りか無しで半角英数字8~11個の数字で入力してください。',
'attributes' => [
        'phone'=>'電話番号',
    ],

コントローラーやRequestsにクロージャーでも書けるそうですが、コードの保守性を鑑みても、make:ruleとしてカスタムバリデーションを作った方が良さそうです。