Laravelのカスタムリクエストクラスについて

# はじめに
こんにちは！エンジニア転職を目指している伊藤です！
現在、転職に向けてオリジナルプロダクトの開発に取り組んでいます。
その中で、Laravelのカスタムリクエストクラスを初めて使用したので記事にまとめようと思います。

# カスタムリクエストクラスとは
Laravelでは通常、HTTPリクエストを処理する際にデフォルトのリクエストクラスを使用しますが、特定のリクエストに対してバリデーションや認可ロジックをカプセル化したい場合、カスタムリクエストクラスを作成することができます。
同じバリデーションを複数のコントローラーに記述したり、コントローラー内に大量のバリデーションを記述したりするような場合にカスタムリクエストを使用すると、コードの再利用性や可読性を上げることができます。

# カスタムリクエストクラスの作成方法

カスタムリクエストクラスを作成するには、以下のコマンドを使用します。

````php: bash
php artisan make:request CustomRequest
````

このコマンドにより、app/Http/Requestsディレクトリ内にCustomRequest.phpというファイルが生成されます。

# カスタムリクエストクラスの構成
生成されたCustomRequestクラスは以下のような構成になっています。

````php: CustomRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CustomRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // リクエストが許可されているかを判断するロジックを実装します。
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        // バリデーションルールを定義します。
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
        ];
    }
}
````

### authorizeメソッド
authorizeメソッドでは、リクエストの実行がユーザーに許可されているかを判断します。ここでtrueを返すと、すべてのユーザーがリクエストを実行できるようになります。特定の条件を満たすユーザーだけがリクエストを実行できるようにするには、このメソッドに適切なロジックを追加します。

### rulesメソッド
rulesメソッドでは、リクエストデータに対するバリデーションルールを定義します。上記の例では、nameフィールドの入力は必須で255文字以下の文字列であることを表しています。また、emailフィールドの入力は必須で有効なメールアドレスかつusersテーブルのemailカラムにユニークであることを表しています。

# カスタムリクエストクラスの使用方法
カスタムリクエストクラスを使用するためには、コントローラーでそのクラスをインポートし、アクションメソッドの引数として渡します。

````php: UserController.php (カスタムリクエストを使う場合)
namespace App\Http\Controllers;

use App\Http\Requests\CustomRequest;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function store(CustomRequest $request)
    {
        // リクエストデータがバリデートされ、ここに到達します。
        $validatedData = $request->validated();

        // ユーザーを作成するロジックをここに記述します。
        User::create($validatedData);

        return response()->json(['message' => 'User created successfully'], 201);
    }
}
````

上記のように、CustomRequestをコントローラーのメソッドの引数として使用することで、リクエストが自動的にバリデートされ、バリデートに失敗した場合はエラーレスポンスが返されます。

# カスタムリクエストクラスを使用しない場合
カスタムリクエストクラスを使用しない場合、バリデーションロジックをコントローラー内に直接記述する必要があります。

````php: UserController.php (カスタムリクエストを使わない場合)
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;

class UserController extends Controller
{
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
        ]);

        User::create($validatedData);

        return response()->json(['message' => 'User created successfully'], 201);
    }
}
````

この方法では、バリデーションルールがコントローラー内に直接記述されるため、以下のデメリットがあります。

* コードの再利用性が低い:  同じバリデーションルールを複数のコントローラーメソッドで使用する場合、同じコードを繰り返し記述する必要があります
* コントローラーが肥大化する: コントローラーにバリデーションロジックが集中すると、コードの可読性が下がり、メンテナンスが困難になります
* テストが困難: バリデーションロジックを個別にテストすることが難しくなります

# カスタムリクエストクラスを使用するメリット

* コードの分離: バリデーションロジックを専用のクラスに分離することで、コントローラーがシンプルになり、責任が明確になります
* 再利用性の向上: カスタムリクエストクラスを使用することで、同じバリデーションルールを複数のコントローラーメソッドで簡単に再利用できます
* コードの可読性向上: バリデーションロジックをコントローラーから分離することで、コントローラーのコードがシンプルになり、読みやすくなります
* テストの容易さ: カスタムリクエストクラスを個別にテストできるため、バリデーションロジックのテストが容易になります

# まとめ
今回、カスタムリクエストを自身のプロダクトで実際に使ってみて、上述したメリットを実感することができました。コードの分離という考え方はプログラミングをするうえでとても重要だと思うので、今後も再利用性や可読性の高いコーディングができるように知識の習得に励みます。