はいさい!ちゅらデータぬオースティンやいびーん!
概要
Laravelでは、URLのクエリパラメーターを取得する二つの方法を解説しながら、注意点とベストプラクティスを紹介していきます。
また、Blade
とController
でのそれぞれの構文も添えておきます。
背景
クエリパラメーターを取得するのには二つの方法があるから、どれを使えばいいか迷います。
しかも、使う方法によって動作と、 ニュアンス が微妙に違います。
ニュアンス というのは、使ったメソッドによって、ソースコーで伝わる意図が変わるということです。
使った手段の結果が一緒でも、伝わる意図が変わるということは小さなことに思えて、実は重要なことです。
- 方法1 - Request::input
メソッド
最もよく使われている方法はIlluminate\Http\Request
のinput
メソッドかと思います。
使い方
まず、使い方を簡単に紹介します。これらのロジックは以下のURLを想定しています。
http://localhost:8080/?mad-max=GreatFilm
Blade
<h1>Is Mad Max any good?</h1>
<p>It`s a {{ request()->input('mad-max') }}</p>
Controller等
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FilmController extends Controller
{
public function view(Request $request)
{
$greatFilm = $request->input('mad-max');
dump($greatFilm); // 'GreatFilm'
}
}
注意点
このメソッドは、クエリパラメーターだけでなく、POST
リクエストの入力も取得できてしまいます。
クエリパラメータとしての値が欲しいのか、<form>
要素内の<input name="mad-max">
の値が欲しいのか、パッとみてわからないのです。
また、本当はクエリパラメーターを使いたかったのに、意図せずに入力情報を使ってしまうおそれもあります。
この方法はあまり明示的ではないので、筆者はクエリパラメーター取得の目的において、推奨しません。
- 方法2 -Request::query
メソッド
次に紹介したいのは、query
のメソッドです。こちらは正式ドキュメントでも2番目にきますが、個人的に最もいい方法かと思います。
なぜかというと、明示的に これはクエリから取るパラメーターだよ〜 という意図がソースコードを通して、チームメンバーに伝わるからです。
使い方
以下のURLを想定します。
http://localhost:8080/?origin=google
今回は、意見を聞くフォームに、どこでこのサイトを見つけたのかも聞くのですが、クエリパラメーターにもその値も入っているのです!
Blade
<form method="post">
<label for="opinion">Is Mad Max any good?</label>
<input name="opinion" id="opinion" type="text">
<label for="origin">Where did you find this site?</label>
<input name="origin" id="origin" value="{{ request()->query('origin') }}">
</form>
Controller等
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FilmController extends Controller
{
public function create(Request $request)
{
$origin = $request->query('origin'); // これはクエリパラメーターに入っている値
}
}
おまけ : 全てのクエリパラメーターを取得する
おまけですが、全てのクエリパラメーターとその値を取得する方法を紹介します。
簡単です。$request->query();
で 引数に何も指定しない のです。
例えばい以下のようなURLだと、配列が出てきます。
http://localhost:8080/?origin=google&reference=
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FilmController extends Controller
{
public function create(Request $request)
{
$queryParameters = $request->query();
dump($queryParameters); // ['origin' => 'google', 'reference' => null]
}
}
ここで気をつけた方がいいのは、reference=
は空文字列の''
ではなく、null
になることです。
まとめ
いかがでしょうか?クエリパラメーターを取得する時の落とし穴をご理解いただきましたでしょうか?
結果重視のプログラミングではなく、コミュニケーションとしてのソースコードを意識して書こうとすると、input
という文字を使って、クエリパラメーターを取得することに違和感を覚えませんか?
筆者は、input
は、<input>
要素に直結するものです。つまり$request->input('hoge');
を見ると、なんだかPOSTのイメージが強いのです。
やっぱり、$request->query('hoge');
を見ると、ああ、書いた人はクエリパラメーターから
とすぐにわかるし、アプリケーションの観点から見ても間違いないでしょう。hoge
君を取りたかったな
このように、複数の方法がある時は、伝わる意図を考慮してコードを書きましょう!