19
14

More than 1 year has passed since last update.

LaravelでURLのクエリパラメーターを取得する二つの方法と注意点

Posted at

はいさい!ちゅらデータぬオースティンやいびーん!

概要

Laravelでは、URLのクエリパラメーターを取得する二つの方法を解説しながら、注意点とベストプラクティスを紹介していきます。

また、BladeControllerでのそれぞれの構文も添えておきます。

背景

クエリパラメーターを取得するのには二つの方法があるから、どれを使えばいいか迷います。

しかも、使う方法によって動作と、 ニュアンス が微妙に違います。

ニュアンス というのは、使ったメソッドによって、ソースコーで伝わる意図が変わるということです。

使った手段の結果が一緒でも、伝わる意図が変わるということは小さなことに思えて、実は重要なことです。

- 方法1 - Request::inputメソッド

最もよく使われている方法はIlluminate\Http\Requestinputメソッドかと思います。

使い方

まず、使い方を簡単に紹介します。これらのロジックは以下のURLを想定しています。

http://localhost:8080/?mad-max=GreatFilm

Blade

blade.php
<h1>Is Mad Max any good?</h1>
<p>It`s a {{ request()->input('mad-max') }}</p>

Controller等

controller.php
<?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

blade.php
<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等

controller.php
<?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=

controller.php
<?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君を取りたかったなとすぐにわかるし、アプリケーションの観点から見ても間違いないでしょう。

このように、複数の方法がある時は、伝わる意図を考慮してコードを書きましょう!

19
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
14