東京都府中市、九段下のWEB制作会社Maromaroのブログです

2023.12.04

松橋一誠

Laravelのカスタムリクエストでバリデーションを実装してコードの再利用性を改善!

こんにちは、Maromaroの松橋です。

今回はLaravelのカスタムリクエストでバリデーションを実装する機会がありましたので、紹介したいと思います!

カスタムリクエストにバリデーションを記述することにより、コントロール横断でバリデーション機能を利用することができます。

通常のCRUD機能を持ったコントロールの他に、CSV用、APIリクエスト用などの様々な受け口に対応したコントローラがある時に、コントローラ個別でバリデーションを記述せずに済むので、Laravelを扱って実装する方で、おすすめの実装方法ではないかと思います。

カスタムリクエストを使うことで、コードの再利用性を改善していきましょう!

実装手順

それでは実装していきます!編集ファイルは下記になります。

今回は商品という想定で、ItemController.phpとItemApiController.phpのコントローラ、ItemRequest.phpのカスタムリクエストとしています。

ItemController.phpは、通常の商品追加用コントローラ、ItemApiController.phpは、API用の商品追加コントローラとして紹介していきます。

ItemRequest.phpが、ItemController.phpとItemApiController.phpのバリデーションを担う仕組みとなります。


└── app
    └── Http
        ├── Controllers
        │   │── ItemController.php
        │   └── ItemApiController.php
        └── Requests
            └── ItemRequest.php

ではまず、カスタムリクエストのファイルを作成します。

$ php artisan make:request ItemRequest

※カスタムリクエスト名は任意の文字列で設定できます。

コマンドを打つと、app/Http/Requests/ItemRequest.php のカスタムリクエストファイルが作成されます。

ファイルの内容は下記です。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ItemRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
     */
    public function rules(): array
    {
        return [
            //
        ];
    }
}

次に、ItemRequest.phpのauthorize()メソッドの戻り値をtrueにします。
※falseのままだとフォームでsubmitした時などに403エラーを返すためです。


    public function authorize(): bool
    {
        return true; // falseからtrueにする
    }

次にバリデーションルールは rules()メソッドの戻り値に記述していきます。
例えば、バリデーションルールを例として追加すると下記のような記述になります。


public function rules(): array
{
    return [
        // ここにバリデーションルールを記述(例)
        'name' => 'required|string|min:1|max:255', // 商品名のバリデーションルール
        'price' => 'required|integer|max:2147483647|min:0', // 金額のバリデーションルール
    ];
}

バリデーションルールの記述ができたら、さっそくコントローラメソッドでカスタムリクエストのバリデーションを利用します。

今回はレコード追加用のstoreメソッドで実装していきましょう。

まず、use App\Http\Requests\ItemRequest; でカスタムリクエストのクラスを利用できるようにします。
次に、storeメソッドの引数に ItemRequest $request を追加をカスタムリクエストのオブジェクトを取得できます。
さいごに、$request->validated(); とすることで、バリデーションを動かすことができます。

ItemControllerのstoreメソッド


use App\Http\Requests\ItemRequest; // 作成したItemRequestクラスの利用

class ItemController extends Controller
{
    public function store(ItemRequest $request) // 引数で ItemRequest $request オブジェクトを取得
    {
        $validated_data = $request->validated(); // ItemRequestオブジェクトでバリデーション
        $item = Item::create($validated_data);
        return redirect()->route('items.detail', ['item' => $item]);
    }
}

ItemApiControllerのstoreメソッド


use App\Http\Requests\ItemRequest; // 作成したItemRequestクラスの利用

class ItemApiController extends Controller
{
    public function store(ItemRequest $request) // 引数で ItemRequest $request オブジェクトを取得
    {
        $validated_data = $request->validated(); // ItemRequestオブジェクトでバリデーション
        $item = Item::create($validated_data);
        return response()->json($item, 201);
    }
}


上記のような使い方で、コントローラ個別でバリデーションを記述せず、コードの再利用性を高めることができたのではないかと思います!

さいごに

カスタムリクエストはバリデーションだけでなく、他にも機能が色々ありましたので、またの機会に紹介したいと思います!

以上、Maromaroの松橋でした。