環境
Laravel v9.5.1 (PHP v8.1.3)
特定の条件のときのみRequestクラスのバリデーションをしたいとき
- FormRequestの
required_if
を使う方法 - バリデーションを適応しない場合は条件文で除外する方法
- バリデーションはnullableにしてコントローラーでエラーを返す方法
今回は、「ユーザーが最初の登録ユーザーだったときのみ」という特定の条件でバリデーションしたいとする。
(いい例ではないけどすみません!)
required_if
を使う方法
genre
がFantasy
のときにtitle
のバリデーションをする。
ただこれは一緒に渡されたパラメータの値を見て、特定の条件だったらバリデーションするものなので今回は使えない。
class CreateBookRequest extends FormRequest
{
public function rules()
{
$rules = [
'title' => 'required_if: genre, Fantasy | string | max:20'
'genre' => 'required | integer',
];
return $rules;
}
}
バリデーションを適応しない場合は条件文で除外する方法
unset
でバリデーションを除外している。
できないことはないけど、CreateBookRequestクラスに条件文を書くのはあまりきれいじゃない気がする。
class CreateBookRequest extends FormRequest
{
public function rules()
{
$rules = [
'title' => 'required | string | max:20',
];
if (最初の登録ユーザーだったらの条件文) {
unset($rules['title']);
}
return $rules;
}
}
バリデーションはnullableにしてコントローラーでエラーを返す方法
Requestクラスではnullable
にして、コントローラーの条件文の中でエラーを返す。
役割が明確に分かれていてきれいな気がする!
class CreatePostRequest extends FormRequest
{
public function rules()
{
return [
'name' => 'nullable | string | max:30',
];
}
}
class BookController extends Controller
{
...
public function store()
{
...
if (最初の登録ユーザーだったらの条件文) {
throw new ValidationException();
}
...
}
}