Laravelでのユーザ入力validation

サイトのユーザ登録を例にLaravelでユーザ入力validationを見ていきます。ユーザ登録の入力項目はデフォルトUserモデルにあるname、emailとpasswordの三つです。emailはユニークでなければなりません。

入力フォームの内容

以下は入力フォームの内容です。見やすさのためにTailwind CSSのclass定義を外しています。

ポイント

  • @error('name’)はname入力フィールドがエラーとなった場合、$messageにエラー内容が保存され、フィールドのすぐ下に表示されます。
  • {{ old('name’) }}はフォームがValidationエラーで戻されたときに前回のユーザ入力内容を表示します。
  • 最後にあるif ($errors->any())はすべてのエラーをまとめて表示してくれます。

<form method="POST" action="/register">
  <div>
    <label for="name">NAME</label>
    <input type="text" name="name" id="name" value="{{ old('name') }}" required>
    @error('name')
      <p>{{ $message }}</p>
    @enderror
  </div>

  <div>
    <label for="email">EMAIL</label>
    <input type="email" name="email" id="email" value="{{ old('email') }}" required>
    @error('email')
      <p>{{ $message }}</p>
    @enderror
  </div>

  <div>
    <label for="password">PASSWORD</label>
    <input type="password" name="password" id="password" value="{{ old('password') }}" required>
    @error('password')
      <p>{{ $message }}</p>
    @enderror
  </div>

  <div>
    <input type="submit" value="Submit">
  </div>

  <!-- エラーをまとめて表示する -->
  if ($errors->any())
  <ul">
      @foreach ($errors->all() as $error)
        <li">{{ $error }}</li>
      @endforeach
  </ul>
  @endif
</form>

コントローラーメソッドの内容

下はコントローラーのstoreメソッドの内容です。

ポイント:

  • Validationルールには2種類の書き方があり、どちらでもよいです。ルールの意味は見ればわかるもので説明不要ですが、unique:users,usernameはusersテーブルのemailフィールドに同じものがあればエラーになります。これを指定しないとvalidationが通ってしまい、データベースのところででエラーになります。
  • validationではないが、passwordはかならずbcryptを使ってハッシュ値を保存するようにしましょう。passwordフィールドの値をハッシュ値に書き換える部分はElequent mutatorを使う方法もあります。これは一番最後のコードスニペットのようにUserモデルクラスにsetPasswordAttribute関数を記述します。関数名のPassword部分は必ずフィールドのキーと一致する必要があります。
public function store() {
    
    // validationルールは2種類の書き方がある
    $attributes = request()->validate([
        'name' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users,email',
        'password' => ['required', 'min:7', 'max:255'],
    ]);

    // passwordの代わりにそのhash値を保存
    $attributes['password'] = bcrypt($attributes['password']);

    // ユーザを作成
    User::create($attributes);

    return redirect('/');
}

Elequent Mutatorの書き方:

// User Classの中
// Elequent Mutator
public function setPasswordAttribute($password) {
   $this->attributes['password'] = bcrypt($password);
}

Laravel,PHP

Posted by deanza329