Laravelのバリデーションで登録時と編集時でルールを変更したい
例えばユーザのパスワードなんかで登録時は必須だけど、編集のときは未入力だとパスワード変更なし、入力があれば変更する、というパターンがあると思います。登録と編集で別々にバリデーションを用意するのも冗長だしresource単位でまとめておきたい、そんな場合の書き方です。確認したバージョンはLaravel5.7です。
public function rules()
{
return [
'name' => 'required|max:255',
'email' => [
'required',
'max:255',
'email',
Rule::unique('users')->ignore($this->user),
],
'password' => ($this->user) ? 'nullable|min:6|confirmed' : 'required|min:6|confirmed',
];
}
↑はFormRequestに定義するrulesになります。ルーティングは↓を想定しています。
Route::resource('users', 'UserController');
また、コントローラー側でデータを保存前にpasswordの入力があるかチェックをして、入力がなければパラメータに含めない、という制御も必要になります。
public function update(UserRequest $request, User $user)
{
$validatedData = $request->validated();
if ($validatedData['password']) {
$validatedData['password'] = Hash::make($validatedData['password']);
} else {
unset($validatedData['password']);
}
$user->update($validatedData);
return redirect()->route('users.show', [$user]);
}