この記事の背景
Laravelでユーザー編集画面を作っていた時に実装したことです。
バリデーションの設定をする時にemailを設定していました。
UserRequest.php
public function rules()
{
return [
#省略,
'email' => [
'required', 'string', 'email', 'max:255']
#省略,
];
}
}
しかしこれだとemailが他人と重複していても登録できてしまいます。
アドレスがわかったら勝手にログインされて勝手に他人に編集されたりします。
解決法
下のコードを追記します。
Rule::unique('users')->ignore($this->id)
これはLaravelフレームワークのバリデーションルールです。
Chat GPIより参照 これは、「table_name」という名前のデータベーステーブルにおいて、特定のIDを持つレコードを除いて、指定されたカラムの値が一意であることを検証するために使用されます。具体的には、ignore($this->id)は、バリデーション中に現在のモデルインスタンス(例えば、フォーム送信時に更新されるユーザープロファイル)を除外するために使用されます。つまり、同じ「table_name」テーブル内で、そのカラムの値が他のレコードと重複することを検証するために使用されますが、現在のモデルインスタンス自体は重複を検証しないようになります。
コードにするとこうなります。
UserRequest.php
public function rules()
{
return [
#省略
'email' => [
'required', 'string', 'email', 'max:255',Rule::unique('users')->ignore($this->id)
],
#省略
];
}
バリデーション のテストしてみたらログイン時に登録済みのユーザーはログインできなくなりました。