Laravelで業務システム

Laravel関連の記事掲載してます

新規登録画面にバリデーションをつけてみる

今回は新規登録画面にバリデーションをつけてみようと思います。

システムにおいてバリデーションは入力ミスを防ぐために重要でありなくてはならないものです。Laravelにもバリデーション機能がありますので、どのように実装するか見ていきます。

どのようなバリデーションをつけるか


勉強ということで、今回は、登録ボタンを押すと、顧客IDが10桁以外の場合、エラーメッセージを顧客IDの入力ボックスの下に出すようにします。

Bladeファイルの編集


まず初めにBladeファイルを編集します。エラーメッセージはBootstrapの機能を利用し表示させるよにしてみます。

すでに、入力画面を作った際に記述しておりましたが、以下のように、入力ボックスのclassに"is-invalid"を記述し、classに"invalid-feedback"を指定したdivタグに記述したメッセージを入れると、Bootstrapのエラーメッセージを表示できます。"@error"ディレクティブはバリデーションでエラーが発生した場合に真になります。よって、エラーがでたときのみエラーメッセージを表示させることができます。

<label for="customer_id">顧客ID</label>
<input name="customer_id" type="number" class="form-control @error('customer_id') is-invalid @enderror" id="customer_id" placeholder="顧客IDを入力してください" value="{{ old('customer_id') }}" required>
@error('customer_id')
    <div class="invalid-feedback">{{ $message }}</div>
@enderror

リクエストファイルの作成


次にリクエストファイルを作成します。

リクエストファイルの中にバリデーションルールを記述し、データがPostされた際、このリクエストファイルを通してチェックを行います。リクエストファイルを作成せず、直接コントローラーに記述できるようですが、コントローラーになんでもかんでも記述することはよくないため、ファイルは分けといたほうがいいでしょう。

リクエストファイルは以下のようにArtisanで作成できます。

#php artisan make:request MstCustomerRequest

リクエストファイルのルールとカスタマイズメッセージを以下のように記述します。

public function rules()
{
    return [
        'customer_id' => ['required','min:10','max:10'],
    ];
}
public function messages()
{
    return [
        'customer_id.min' => '顧客IDは10桁です。',
        'customer_id.max' => '顧客IDは10桁です。',
    ];
}

rules関数にルールを記述します。ルールはいろいろと用意されてますが、カスタマイズルールをつくることもできます。実際はカスタマイズルールのほうが主になるかもしれません。

messages関数はなくても動作します。ただし、その場合は、言語ファイルのデフォルトメッセージがでてしまい、言語ファイルを日本語化していても、分かり難いメッセージとなりますので、messages関数を用いてメッセージをカスタマイズしてます。

このルールのところはすこし変わった記述でとっつきにくいかもしれないですが、すぐに慣れます。

コントローラとリクエストファイルの紐づけ


次にコントローラー内のstore関数とリクエストファイルを紐づけます。

まずMstCustomerController.php内に作成したリクエストクラスをuse演算子を以下のように記述しインポートします。

use App\Http\Requests\MstCustomerRequest;

次にstore関数の引数をリクエストクラスの型宣言(タイプヒント?)に変更します。‘

public function store(MstCustomerRequest $request)

以上で、今回やりたかったことは終わりです。

まとめ


なんか、これだけでできるなんて、狐につままれた感じですが、ほかの方法でバリデーションを実装することが馬鹿らしくなるほど便利ですね。

次回は、カスタマイズルールも実装してみたいと思います。