1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel】特定の条件のときのみRequestクラスのバリデーションをする方法3つ

Posted at

環境

Laravel v9.5.1 (PHP v8.1.3)

特定の条件のときのみRequestクラスのバリデーションをしたいとき

  • FormRequestのrequired_ifを使う方法
  • バリデーションを適応しない場合は条件文で除外する方法
  • バリデーションはnullableにしてコントローラーでエラーを返す方法

今回は、「ユーザーが最初の登録ユーザーだったときのみ」という特定の条件でバリデーションしたいとする。
(いい例ではないけどすみません!)

required_ifを使う方法

genreFantasyのときに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();
    }
    ...
  }
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?