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

当サイトではアフィリエイト広告を利用して商品を紹介しています。
当サイトではアフィリエイト広告を利用して商品を紹介しています。

バリデーションとは

バリデーションとは入力時に必要な値が入力されているかチェックする機能のことです。

バリデーションを設定することで入力エラーを未然に防ぎ、必要な値の入力を促します。

今回はlaravel公式サイトの日本語訳サイトのドキュメントを参考にして、バリデーションを実装してみました。

Laravel 6.x バリデーション

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

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

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

表示のイメージは上記のような感じとなります。

ちなみにのエラーメッセージはカスタイズできるので便宜上”error message”としています。

バリデータの生成

バリデータとはバリデーションを行う機能のことです。

バリデータの生成するにはバリデータを使うコントローラーにValidatorファサードを使えるように次のコードを追加する必要があります。

今回はUserController.phpに追加します。

こういうコードって忘れがちなんで気をつけていただければと思います。

<?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’となっていて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);

 

わかりやすくするためにルールを1つにしたことでコードをすっきりすることができたと思います。

上記のように3つの引数を完全に分けて考えたほうが、複雑になってもメンテナンスしやすいんじゃないでしょうか?

私も見直すために投稿しているのでわかりやすくしたつもりなので、皆様の参考になればと思います。

 

タイトルとURLをコピーしました