エンジニ屋.com(エンジニヤドットコム)

分かりやすくを意識して情報発信!

【Laravel】$request(Requestクラス)とrequest()(ヘルパ関数)の違い


Request $requestとrequest()の違いって何?!

本記事は、この様な疑問に対して解決・理解できる内容になっています。

例えば、ソースコードは以下とします。

index.blade.php

<form action="/confirm" method="post">
       @csrf
      <input type="text" name="name" >
      <input type="submit" value="送信">
 </form>

MainController.php

use Illuminate\Http\Request;

class MainController extends Controller
{
   public function confirm(Request $request)
   {
       $request; // Requestクラス
       request();   //  グローバルヘルパ関数

       return view('complete');
   }
}

シンプルな入力画面とControllerでデータ取得をする内容です。

因みに$requestのRequestクラスは、コマンド( php artisan make:controller)を実行した場合に、デフォルトで生成される「Illuminate\Http\Request」を指すとします。

RequestクラスはLaravelで複数用意されています。 違いを知りたい方は、こちらの記事をどうぞ。

enginiya.com

$requestとrequest()

さて、ソースコードではbladeファイルからpostされたデータを取得するために記述しています。

$request と request() の取得に違いはあるのでしょうか?

先に結論を述べると両方結果は同じです。

確認の為にdd()で出力してみます。

両方とも同じようにIlluminate\Http\Requestクラスのインスタンスを返します。

したがって、request()を使って呼び出すことができるメソッドは、Illuminate\Http\Requestクラスで定義されているメソッドになります。

例えば、input()のメソッドを使用する場合、

request()では、 

request()->input('name');

$requestでは、 

$request->input('name');

のように記述すると指定されたキーに関連付けられた入力データを取得します。

代表的なメソッドは以下の通りです。

メソッド

同じように利用できます。

all(): 全ての入力データを連想配列として取得します。
only($keys): 指定されたキーに関連付けられた入力データのみを連想配列として取得します。
except($keys): 指定されたキーを除く入力データを連想配列として取得します。
has($key): 指定されたキーが存在し、値が空でないかどうかを判定します。
filled($key): 指定されたキーが存在し、値が空でないかどうかを判定します。
query($key = null, $default = null): クエリ文字列から指定されたキーに関連付けられたデータを取得します。
file($key = null, $default = null): アップロードされたファイルを取得します。

他にも非常に便利なメソッドが用意されているので、ドキュメントを確認してみましょう!

公式ドキュメント Illuminate\Http\Request | Laravel API

FormRequest

メソッドの引数にFormRequest クラスを入れることで、どちらの記述でもバリデーションを実装できます。

 public function confirm(InputFormRequest $request)
   {
       request();   //  グローバルヘルパ関数

       return view('complete');
   }

ただし、この場合はわざわざrequest()を記述する必要ありませんね。

引数で$requestをインスタンスで呼び出しているので、以降は$requestを使用するべきです。

$requestとrequest()もどちらも同じメソッドを使用できることがわかりました。

では、どのように使い分けるのか?

主な使い分け

$request

Controllerファイルの中では、基本的に$requestを使用します。

ただし、個人的にはFormRequestもなくdeleteメソッド内でid()を呼び出すときには、Controllerファイルの中でも下記のようにrequest()を使ったりします。

public function delete()
{
  $result = Member::destroy(request('id'));
   

Controller以外にMiddlewareやServiceProviderの中でも使用されます。

引数に依存性注入 (Dependency Injection) としてリクエストデータを明示的に示すことで、リクエストデータがどこから来るのかが明確になるため可読性があがるのもメリットです。

request()

request()は、メソッド内外を問わず、任意の場所でリクエストデータにアクセスする場合に使用します。

リクエストデータの取得や、例えば、特定のリクエストパラメータの存在をチェックする際によく使用されます。

bladeでもわざわざ変数として渡すのは面倒だという場合に、サクッとリクエストデータを呼び出せるのでメリットです。

<input type="name" name="name" value="{{ request('name') }}">

以上となります。

基本的には、開発者やチームの好みにもよりますが、一貫したコーディングスタイルを維持することが重要だと思います。

お疲れ様でした。 Twitterのフォローもよろしくお願いします!