##はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。
今回は、Laravelには$request->get()や$request->input()
といった、LaravelのControllerにおけるリクエストの受け取り方が複数あり、どれを使用すれば良いのか分からなかったので、解決する為に調べたことを備忘録としてまとめておきたいと思います。
間違いなどがございましたら、ご指摘のほどよろしくお願い致します。
##入力値を取得する様々な選択肢がある
下記のような入力値を取得するメソッドは、似たような働きをしますが1つずつ微妙な違いがあります。
public function store(Request $request) {
$example = $request->input('example');
$example = $request->get('example');
$example = $request->example;
$example = request('example');
etc...
}
他にも、クエリストリングからの入力値を取得したり、入力データの一部を指定して取得することもできますので、詳細は、Laravel6.x HTTPリクエストを確認して下さい。
##"$request->input()"
$request->input()
は、公式ドキュメントでも説明されていますので簡単にまとめておきます。
特徴:
・input()メソッドは、Illuminate\Http\Requestインスタンスのメソッドであり、全てのリクエストのHTTP動詞に対してユーザー入力値を取得できます。
・全入力値を連想配列として取得するために、引数を渡さずにinputメソッドを呼び出すことも可能です。
・input()メソッドは、リクエストのペイロード全体(クエリ文字列を含む)から値を取得します。
・リクエストボディ+クエリストリングを取得し、リクエストボディが優先されます。
$user->name = $request->input('name');
$input = $request->input();
##"$request->get()"
$request->get()
は、基本的に使わないようにしています。
理由は、下記の特徴があるからです。(間違いがあればご指摘ください)
特徴:
・$request->get()では、配列から値を取得することができません。
・引数を取らない場合、input()は値を連想配列で返しますが、get()は引数が必須です。
・リクエストボディ+クエリストリングを取得でき、クエリストリングを優先して入力値を取得できますが、クエリストリングからデータを取得したい場合は$request->query('example');
といったように、queryメソッドを利用するので使う必要がない。
##"$request->example"(動的プロパティの使用)
$request->example
は、Illuminate\Http\Requestインスタンスに対する動的プロパティとして、ユーザーインプットにアクセスすることも可能です。
特徴:
・動的プロパティを使用すると、まず初めにリクエストパラメータの中で名前が一致するものを探し、なければ次にルーティングのパラメータを探しに行きます。
$name = $request->name;
##"request()ヘルパ"
request()ヘルパ
は、現在のリクエストインスタンスを返したり、入力項目を取得したりします。基本的には、$request->input()と同じ働きをします。
特徴:
・引数を空にするとIlluminate\Http\Request
のインスタンスが返ってきます。
・フォーム・パラメータを取得する場合は第1引数でキーを指定します。
・第2引数にはデフォルト値を指定することもできます。
$request = request();
$value = request('key', $default);
##まとめ
基本的には、公式ドキュメントにも書かれている$request->input()
を使用して入力値を取得するのが無難だと思いました。
また、controllerクラスのメソッド内では複数の入力値を指定して使用したいケースが多いと思うので、そのような場合はonly
を使うことで可読性が担保されたままコード綺麗に書けるのではないかと思います。
他にも、$input = $request->all();
を利用することで、全入力値を配列で取得することができますが、受け取りたくない値まで受け取ってしまう可能性もあるので基本的には使わないようにしたいと思いました。