🗂

Laravel FormRequestクラスのバリデーション前後でよく使うメソッド

2023/11/21に公開

Laravel FormRequestクラスのメソッドでよく使うメソッド
validationDataは、バリデーションのデータを加工して特にコントローラーではリクエストの値を取得する必要がない時、
prepareForValidationは、バリデーション前にリクエストデータを加工して、コントローラーでリクエストの値を取得したい時、
passedValidationは、バリデーション後にリクエストデータを加工して、コントローラーに引き渡したいときに使うようですね。

たとえば、Restfull APIで開発するときにuser_idをパラメータにしたある場合

// api.php
    Route::get('/users/{user_id}', 'Api\UsersController@getUser');
// GetUserRequest.php
// バリデーション前にデータを加工
    protected function validationData()
    {
      // api.phpの{user_id}の値を取得する
        $params = $this->all();
        $user_id = $this->route('user_id');
        return $params + ['user_id' => $user_id];
  
    }
// バリデーションの前にデータを加工
// URIからパラメータを取得して、リクエストの値を直接したりできる
// $this->mergeでRequestオブジェクトにデータが格納されてコントローラーで取得できる
  protected function prepareForValidation() {
      $this->merge(['user_id' => $this->route('user_id') ]);
  }
  
  // UsersController.php
  public function getUser(GetUserRequest $request){
      $params = $request->only(['user_id']);
  }
// バリデーション後にデータを加工する場合
    protected function passedValidation()
  {
      // バリデーションが成功した場合の処理をここに記述します
      // 例: データベースにデータを保存する

      // $this->validated() でバリデーションを通過したデータにアクセスできます
      $data = $this->validated();

      // データベースに保存する例
      // User::create($data);

      // または、コントローラーにデータを渡す場合
      // $this->merge(['extra_data' => 'some_value']);
  }
  
      /**
   * withValidator
   * コントローラーでRequestFromクラスから取れるようにする。
   * @param  [type] $validator
   * @return void
   */
  protected function withValidator($validator)
  {
      // バリデータが作成された後に実行される処理
      $validator->after(function ($validator) {
          // バリデーションが成功した場合に追加のデータをリクエストに追加
          $interviewFbId = $validator->getData()['interview_fb_id'];
          $this->merge(['interview_fb_id' => $interviewFbId]);
      });
  }

Discussion