はじまり
人間さん「なになに、このフォームには顧客IDを入れると」
人間さん「1234っと」
顧客IDは10文字以内で入力してください
人間さん「え、、4文字なのになんで」
人間さん「不具合かな?」
いぬ先生「ちょっと見てみようか」
原因
いぬ先生「状況分かったよ」
人間さん「どんなかんじ?」
$rules = [
'customer_id' => ['max:10', 'integer']
];
integerが条件に含まれていたから
いぬ先生「今はこうなっているのだけど」
いぬ先生「Laravelではほかのバリデーションとの組み合わせで」
いぬ先生「確認方法が変化するルールがあって」
いぬ先生「今回のように指定ルールにintegerまたはnumericが含まれる場合、」
いぬ先生「maxは文字列長ではなくて、値として確認することになってる」
人間さん「つまりどういうこと?」
いぬ先生「今回だと10文字まで入力可ではなく、」
いぬ先生「1~10の数値が入力できるってこと」
人間さん「試してみるよ」
人間さん「確かに10だったら通ったけど、」
人間さん「11以降ははじかれたよ!」
対応策
人間さん「でもあれだな」
人間さん「意図は、10文字までかと整数であるかを確認したいんだけど…」
正規表現で解決する【regex】
いぬ先生「そしたら正規表現を使うのはどうだろう」
$rules = [
'customer_id' => ['max:10', 'regex:/^(0|[1-9]\d*)$/']
];
いぬ先生「これで10文字までかの条件を残しつつ、」
いぬ先生「正規表現で数字であるかを確認する」
人間さん「登録できた!」
桁範囲指定でもよい話【digits_between】
いぬ先生「いまさらだけど、要は10桁以内の数値だったらいいのかな?」
人間さん「そうそう」
いぬ先生「それならこれでもよかったのかも」
$rules = [
'customer_id' => 'digits_between:1,10'
];
Laravel9 では最大桁数指定が使える【max_digits】
いぬ先生「新しく条件でmax_digitsなるものが追加されたようだよ」
$rules = [
'customer_id' => 'max_digits:10'
];
※日本語ドキュメント抜粋
max_digits:value - Laravel 9.x バリデーション
整数フィールドが、最大値桁数以下であることをバリデートします。
いぬ先生「名称からして最大10桁までということが一目でわかっていいね」
参考文献
-
Laravelの「numeric」と「max」バリデーションのエラー。文字長と数量が変化して起こる - CROSS ACCELERATE
-
Laravel 9.x バリデーション
https://readouble.com/laravel/9.x/ja/validation.html#rule-max
https://readouble.com/laravel/9.x/ja/validation.html#rule-size
https://readouble.com/laravel/9.x/ja/validation.html#rule-max-digits -
Laravel.com(英語)
https://laravel.com/docs/9.x/validation#rule-max
https://laravel.com/docs/9.x/validation#rule-size
https://laravel.com/docs/9.x/validation#rule-max-digits -
PHPフレームワーク Laravel Webアプリケーション開発 P131