見出し画像

Laravelでオリジナルリクエストを作る

はじめに

Laravelでリクエストを作る方法を紹介します。リクエストを作ることによってバリデーションをコントローラー外で行うことができるようになります。バリデーションというとformのバリデーションを思い浮かべるかもしれませんがそれ以外にもリクエストそのもの例えばurlのパラメーターやpostされた時のbodyの中身も検証することができます。今回はapiでbodyを通して情報が送られてくるようなリクエストに対して作っていきます!では早速作っていきます。

1. ルート定義、リクエストクラス作成

ルーティングです。

Route::post('/book', [BookController::class,'createBook']);

今回はapiを作っていくのでapi.phpに書いてください。ここからわかると思いますがコントローラーはBookContorllerを使います。

リクエストクラスに関してですがこれに関してもaritisanコマンドが用意されています!

php artisan make:request CreateBookRequest

app/Http/Requests内にできていると思います。

2.コントローラーと関連づける

とりあえずコントローラーと関連づけてみます。先ほども書いたのですがコントローラーはBookControllerです。関数はcreateBookとなります。

public function createBook(CreateBookRequest $request)
{    
    ...

これだけです。普段なら引数はRequest $requestとかにしていると思うのですがこのようにするだけでオリジナルのリクエストを作ることができます。

3.バリデーションルール追加

まずリクエストbodyの中身を定義していないので示しておきます。

{
    "author" : "author name",
    "title" : "my childhood",
    "price" : 2500,
}

このような感じのものが送られてくるとしましょう。作者の名前、タイトル、値段を用意しました。今回バリデートをするにあたり

・全ての要素が含まれていること

・作者、タイトルは文字列、値段は数字であること

の2つを確認してみたいと思います。

その場合リクエストクラスの中身は以下のようになります。

 public function authorize()
 {
     return true;
 }
 
 public function rules()
 {
     return [
     'author' => ['required','string'],
     'title' => ['required','string'],
     'price' => ['required','integer'],
     ]
 }

 protected function failedValidation(Validator $validator)
 {
       $res = response()->json([
           'status' => 400,
           'errors' => $validator->errors(),
       ], 400);
       throw new HttpResponseException($res);
 }

これだけで実装できるはずです。上から関数を説明していきます。

一番上は認証の検証です。今回は特に必要ないので何もせずにtrueを返します。

rulesは中身の検証です。左側の要素を自動的に取得してくれて検証してくれます。右側のrequiredやstringに関してはバリデーションの時と書き方が同じです。詳しい説明はドキュメントを見てください。

最後はfaildValidation失敗した時の処理です。とりあえず400、エラー内容を返すようにしています。場合によってはエラー表示は脆弱性になることもあると思うので良く考えてから実装してください。

4.コントローラーで値取得

バリデーションは終わったので後はコントローラーで処理するだけです。ここでは取得方法を示します。

public function createBook(CreateBookRequest $request)
{    
    $data = $request->all();
    $author = $data['author'];
    $title = $data['title'];
    $price = $data['price'];
    ...

最初のdataにそこからallを使うことによって全ての要素を取得することができます。今回の場合それぞれの値が含まれていることが保証されているため例外署の必要もありません!

まとめ

どうでしたでしょうか?リクエストを作ることによって値が保証されたりコントローラーが綺麗になったりします。使わない理由はないと思うので積極的に使っていくべきだと思っています。

補足

今回はルートが一つだったので実装はしなかったのですがリクエスト内で認証は必要ない、失敗したら400を返して欲しいといったことはよくあると思います。そのような時は重複する要素を別クラスに切り分けて必要な時に継承するといった使い方もできると思います。その場合個別のリクエストクラスはrule関数のみといったこともできると思います。便利ですね。

この記事が気に入ったらサポートをしてみませんか?