Laravelのバリデーションの組み合わせでハマったバグと対策について


動作環境

  • Laravel 5.5
  • php 7.2

ハマったこと

LaravelでRequestのバリデーションを以下のように記述していました。

public function messages()
{
    return [
        .
        .
        'max' => ':attributeは5文字以内で入力してください'
        'numeric' => ':attributeは数値で入力してください'
        .
        .
    ];
}

public function rules()
{
    return [
        .
        .
        .
        'address1' => 'required|numeric|max: 3',
        'address2' => 'required|numeric|max: 4',
        .
        .
        .
    ];
}

自分が予想していた動作結果として、入力されたFormのvalueが数値かつ5文字以下のときはバリデーションエラーにならないというものでした。

しかしながら、結果として、address1に3文字の数値、address4文字の数値を入力するとaddress1は3文字以内で入力してください, address2は4文字以内で入力してくださいと出てしまいました。

対策

別のバリデーションで数字かつその文字数ならバリデーションが通るdegitsというものがあるので、こちらを使いましょう
また、数字かつその文字数の範囲になら受け付けるdegits_betweenもあります。

以下使用例

public function messages()
{
    return [
        .
        .
        .
        'max' => ':attributeは5文字以内で入力してください'
        'numeric' => ':attributeは数値で入力してください'
        .
        .
        .
    ];
}

public function rules()
{
    return [
        .
        .
        'address1' => 'required|degits: 3',
        'address2' => 'required|degits_between: 1, 4',
        .
        .
    ];
}