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で複数用意されています。 違いを知りたい方は、こちらの記事をどうぞ。
$requestとrequest()
さて、ソースコードではbladeファイルからpostされたデータを取得するために記述しています。
$request と request() の取得に違いはあるのでしょうか?
先に結論を述べると両方結果は同じです。
確認の為にdd()で出力してみます。
両方とも同じようにIlluminate\Http\Requestクラスのインスタンスを返します。
したがって、request()を使って呼び出すことができるメソッドは、Illuminate\Http\Requestクラスで定義されているメソッドになります。
例えば、input()のメソッドを使用する場合、
request()では、
request()->input('name');
$requestでは、
$request->input('name');
のように記述すると指定されたキーに関連付けられた入力データを取得します。
代表的なメソッドは以下の通りです。
メソッド
同じように利用できます。
他にも非常に便利なメソッドが用意されているので、ドキュメントを確認してみましょう!
公式ドキュメント 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のフォローもよろしくお願いします!