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);
}
ディスカッション
コメント一覧
まだ、コメントがありません