【Laravel】バリデーションを実装してみた

2021/07/04に公開

バリデーションとは

バリデーションとは入力時に必要な値が入力されているかチェックする機能のことです。
バリデーションを設定することで入力エラーを未然に防ぎ、必要な値の入力を促します。
今回はlaravel公式サイトの日本語訳サイトのドキュメントを参考にしてバリデーションを実装してみました。
https://readouble.com/laravel/6.x/ja/validation.html

バリデーションエラーを表示

バリデーションエラーを表示できるようにviewファイルに以下のコードを追加しました。

@if($errors->any())
  <div class="alert alert-danger">
    <ul>
      @foreach($errors->all() as $error)
        <li>{{$error}}</li>
      @endforeach
    </ul>
  </div>
@endif

バリデータの生成

バリデータとはバリデーションを行う機能のことです。
バリデータの生成するにはバリデータを使うコントローラーにValidatorファサードを使えるようにコードを追加する必要があります。
今回はUserController.phpに追加します。
こういうコードって忘れがちなんで気をつけていただければと思います。

  namespace App\Http\Controllers;

  use App\Http\Controllers\Controller;
  use Illuminate\Http\Request;
+ use Illuminate\Support\Facades\Validator; //この行を追加

次にUseControllerクラスのstore関数に次のコードを追加します。

class UserController extends Controller {
  public function store(Request $request) {
    $validator = Validator::make($request->all(), [
      'title' => 'unique:users',
    ]);
    if ($validator->fails()) {
      return redirect('users/create')
        ->withErrors($validator)
        ->withInput();
    }
  }
}

makeメソッドの第1引数の$request->all()はバリデーションを行うデータでリクエストのすべてを取得しています。
第2引数はそのデータに適用するバリデーションのルールです。
titleに適用するルールはunique:usersでusersテーブルに使われているtitleは重複不可と言う意味です。
次にバリデーションでエラーが生じた場合のコードがif文から書いてありますが、私もよくわからないのでこういうものだということにしておきます。

さきほどのコードで出てきたバリデータは3つに引数があります。

$validator = Validator::make($input, $rules, $messages);

第1引数と第2引数は上記で説明したように最後の第3引数はエラーメッセージのカスタムメッセージを渡します。
最初に出てきたエラーメッセージ”error message”を日本語にしてみたいと思います。
以下のようなコードでカスタムエラーメッセージを指定できます。

$messages = [
  'title.unique' => 'titleが重複しています。',
];

バリデータのまとめ

//第1引数:バリデーションを行うデータ
$input = $request->all();
//第2引数:そのデータの適用するルール
$rules = ['title' => 'unique:users'];
//第3引数:カスタムエラーメッセージを指定する
$messages = ['title.unique' => 'titleが重複しています。'];
$validator = Validator::make($input, $rules, $messages);

上記のように3つの引数をメソッドの外で指定します。
うすると複雑になってもメンテナンスしやすいんじゃないでしょうか?

わかりやすくしたつもりなので皆様の参考になればと思います。

GitHubで編集を提案

Discussion