Laravel バリデーションについてまとめていくよ4(文字フォーマット)に続いてlaravelのバリデーションをまとめていきます。
今回は、日付についてのバリデーションを確認します。
確認するルールはdate
、date-format
、date-equals
、after
、after-or-equal
、before
、before-or-equal
、timezone
です。
記事の目次
date | 日付
strtotime
関数で正当性を検査し、date_parse
関数で相対指定(+1day
など)でないことをチェックします。
$rules = ['parameter' => 'date']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // 英語表記 $data = ['parameter' => '10 September 2000']; Validator::make($data, $rules)->passes(); // true // 相対表記 $data = ['parameter' => 'now']; Validator::make($data, $rules)->passes(); // false // 相対表記 $data = ['parameter' => '+1 day']; Validator::make($data, $rules)->passes(); // false // 日時表記 $data = ['parameter' => '2006-12-12 10:00:00']; Validator::make($data, $rules)->passes(); // true // 日付表記 $data = ['parameter' => '2006-12-12']; Validator::make($data, $rules)->passes(); // true // 日時表記(スラッシュ区切り) $data = ['parameter' => '2006/12/12 10:00:00']; Validator::make($data, $rules)->passes(); // true // 日付表記(スラッシュ区切り) $data = ['parameter' => '2006/12/12']; Validator::make($data, $rules)->passes(); // true // 日付の区切りなし $data = ['parameter' => '20061212']; Validator::make($data, $rules)->passes(); // true // 時間表記 $data = ['parameter' => '10:00:00']; Validator::make($data, $rules)->passes(); // false
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L489-L513
date_format | 日付フォーマット
DateTime::createFromFormat
でパース後、引数の形式に再フォーマットを行い、入力値と一致するかをチェックします。
$rules = ['parameter' => 'date_format:Y-m-d H:i:s']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // 正常系 $data = ['parameter' => '2023-12-31 23:59:59']; Validator::make($data, $rules)->passes(); // true // 正常系 $data = ['parameter' => '2023-01-01 00:00:00']; Validator::make($data, $rules)->passes(); // true // 前ゼロの省略 $data = ['parameter' => '2023-1-1 00:00:00']; Validator::make($data, $rules)->passes(); // false // 不足 $data = ['parameter' => '2023-12-31']; Validator::make($data, $rules)->passes(); // false
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L515-L540
date_equals | 日付の一致
入力した日付が引数で指定した日付と一致するかをチェックします。
引数には日付だけでなく、比較対象のフィールド名を指定することで、2つのフィールドが同一の日であることをチェックできます。
また、date_format
のルールが一緒に設定されている場合は、パースする際に利用されます。
日付文字列を引数に指定
$rules = ['parameter' => 'date_equals:2023-12-01']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // 一致 $data = ['parameter' => '2023-12-01']; Validator::make($data, $rules)->passes(); // true // 不一致 $data = ['parameter' => '2023-12-02']; Validator::make($data, $rules)->passes(); // false // 表記のブレ $data = ['parameter' => '2023/12/01']; Validator::make($data, $rules)->passes(); // true // 一致してしまう $data = ['parameter' => '2023-11-31']; Validator::make($data, $rules)->passes(); // true // 時分秒を指定しない場合は00:00:00として扱われるため一致 $data = ['parameter' => '2023-12-01 00:00:00']; Validator::make($data, $rules)->passes(); // true // 時分秒を指定しない場合は00:00:00として扱われるため不一致 $data = ['parameter' => '2023-12-01 00:00:01']; Validator::make($data, $rules)->passes(); // false
フィールド名を引数に指定
$rules = ['firstDate' => 'date_equals:secondDate']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['firstDate' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['firstDate' => '']; Validator::make($data, $rules)->passes(); // true // 一致 $data = [ 'firstDate' => '2023-12-01', 'secondDate' => '2023-12-01', ]; Validator::make($data, $rules)->passes(); // true // 比較先がnull $data = [ 'firstDate' => '2023-12-01', 'secondDate' => null, ]; Validator::make($data, $rules)->passes(); // false // 不一致 $data = [ 'firstDate' => '2023-12-01', 'secondDate' => '2023-12-02', ]; Validator::make($data, $rules)->passes(); // false // 時分秒まで一致 $data = [ 'firstDate' => '2023-12-01 01:00:00', 'secondDate' => '2023-12-01 01:00:00', ]; Validator::make($data, $rules)->passes(); // true // 時分秒が不一致 $data = [ 'firstDate' => '2023-12-01 01:00:00', 'secondDate' => '2023-12-01 01:00:01', ]; Validator::make($data, $rules)->passes(); // false // フォーマット違い $data = [ 'firstDate' => '2023-12-01', 'secondDate' => '2023/12/01', ]; Validator::make($data, $rules)->passes(); // true // 一致してしまう $data = [ 'firstDate' => '2023-12-01', 'secondDate' => '2023-11-31', ]; Validator::make($data, $rules)->passes(); // true // 時分秒を指定しない $data = [ 'firstDate' => '2023-12-01 00:00:00', 'secondDate' => '2023-12-01', ]; Validator::make($data, $rules)->passes(); // true
日付のチェックは気を遣おう
2023-11-31
はパースされると、2023-12-01
となるため、上記のサンプルのようにdate_equals
ルールのみを指定した場合に意図しない値を許容してしまいます。
date
のルールを一緒に設定することで、2023-11-31
はバリデーションエラーとできます。
時分秒を指定しない場合に、00:00:00
として扱われるため、2023-12-01
と一致するかのチェックに対して、2023-12-01 00:00:00
という値を許容します。
date_format
のルールをに設定することでフォーマットを守ることができます。
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L542-L555
after | 指定日よりも後
引数に日付を指定した場合は、入力値 > 引数の日付であることをチェックします。
比較対象のフィールド名を指定することで、入力値 > 比較対象のフィールドであることをチェックします。
日付文字列を引数に指定
$rules = ['parameter' => 'after:2023-12-10']; // 前日 $data = ['parameter' => '2023-12-09']; Validator::make($data, $rules)->passes(); // false // 当日 $data = ['parameter' => '2023-12-10']; Validator::make($data, $rules)->passes(); // false // 翌日 $data = ['parameter' => '2023-12-11']; Validator::make($data, $rules)->passes(); // true
フィールド名を引数に指定
$rules = ['parameter' => 'after:secondDate']; $data = [ 'firstDate' => '2023-12-09', 'secondDate' => '2023-12-10', ]; Validator::make($data, $rules)->passes(); // false $data = [ 'firstDate' => '2023-12-10', 'secondDate' => '2023-12-10', ]; Validator::make($data, $rules)->passes(); // false $data = [ 'firstDate' => '2023-12-11', 'secondDate' => '2023-12-10', ]; Validator::make($data, $rules)->passes(); // true
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L199-L212
after_or_equal | 指定日以降
引数に日付を指定した場合は、入力値 ≧ 引数の日付であることをチェックします。
比較対象のフィールド名を指定することで、入力値 ≧ 比較対象のフィールドであることをチェックします。
before | 指定日よりも前
引数に日付を指定した場合は、引数の日付 > 入力値であることをチェックします。
比較対象のフィールド名を指定することで、比較対象 > 入力値のフィールドであることをチェックします。
before_or_equal | 指定日以前
引数に日付を指定した場合は、引数の日付 ≧ 入力値であることをチェックします。
比較対象のフィールド名を指定することで、比較対象 ≧ 入力値のフィールドであることをチェックします。
timezone | タイムゾ-ン文字列
timezone_identifiers_list
の関数に定義されているかをチェックします。
大文字、小文字も区別されます。
$rules = ['parameter' => 'timezone']; // リクエストにパラメーターが含まれていない $data = []; Validator::make($data, $rules)->passes(); // true // null $data = ['parameter' => null]; Validator::make($data, $rules)->passes(); // false // 空文字 $data = ['parameter' => '']; Validator::make($data, $rules)->passes(); // true // 半角スペース $data = ['parameter' => ' ']; Validator::make($data, $rules)->passes(); // true // 空配列 $data = ['parameter' => []]; Validator::make($data, $rules)->passes(); // false // 東京 $data = ['parameter' => 'Asia/Tokyo']; Validator::make($data, $rules)->passes(); // true // 当日 $data = ['parameter' => 'asia/Tokyo']; Validator::make($data, $rules)->passes(); // false // UTC $data = ['parameter' => 'UTC']; Validator::make($data, $rules)->passes(); // true // utc $data = ['parameter' => 'utc']; Validator::make($data, $rules)->passes(); // false
Laravelでの実装はこちら。
https://github.com/laravel/framework/blob/v9.45.1/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L2133-L2143