2023.12.04
Laravelのカスタムリクエストでバリデーションを実装してコードの再利用性を改善!
こんにちは、Maromaroの松橋です。
今回はLaravelのカスタムリクエストでバリデーションを実装する機会がありましたので、紹介したいと思います!
カスタムリクエストにバリデーションを記述することにより、コントロール横断でバリデーション機能を利用することができます。
通常のCRUD機能を持ったコントロールの他に、CSV用、APIリクエスト用などの様々な受け口に対応したコントローラがある時に、コントローラ個別でバリデーションを記述せずに済むので、Laravelを扱って実装する方で、おすすめの実装方法ではないかと思います。
カスタムリクエストを使うことで、コードの再利用性を改善していきましょう!
※カスタムリクエスト名は任意の文字列で設定できます。
コマンドを打つと、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);
}
}
上記のような使い方で、コントローラ個別でバリデーションを記述せず、コードの再利用性を高めることができたのではないかと思います!