アゴ乗せ日記

適当なポジティブ日記

スポンサーリンク

Laravelでクエリパラメータを順番どおり取得する

今日はタイトル通りなのですが、Laravelでクエリパラメータを順番通り取得するです。

これ意外と調べても無かったり、用意されていないみたい。(たぶん)

実現した方法

$request->server->get('QUERY_STRING'); で取得

試したもの

  • $request->fullUrl();
  • $request->getQueryString();
  • $request->getRequestUri();
  • $request->server->get('QUERY_STRING');

それぞれ挙動を見ていきましょう

api.phpに以下を追記

Route::get('test', 'TestController@getQueryParameter');

TestController.phpを作成

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    public function getQueryParameter(Request $request) {
        $result = array(
            'fullUrl' => $request->fullUrl(),
            'getQueryString' => $request->getQueryString(),
            'getRequestUri' => $request->getRequestUri(),
            'QUERY_STRING' => $request->server->get('QUERY_STRING'),
        );
        return json_encode($result, JSON_UNESCAPED_UNICODE);
    }
}

リクエストしてみる

http://localhost:8000/api/test?text=junban&order=123

結果

{
    "fullUrl": "http:\/\/localhost:8000\/api\/test?order=123&text=junban",
    "getQueryString": "order=123&text=junban",
    "getRequestUri": "\/api\/test?text=junban&order=123",
    "QUERY_STRING": "text=junban&order=123"
}

どうでしょう。 fullUrlgetQueryStringはパラメータの順番が変わっていますね。
おそらくパラメータ名の昇順にソートして並び変わっています。

getRequestUriQUERY_STRINGは期待通りに取れました。 今回はURLパスは必要としないためQUERY_STRINGを採用です。

配列に詰める

parse_strを使って配列に詰めてみます。

TestController.phpを修正します。

<?php

...省略
        $result = array(
            'fullUrl' => $request->fullUrl(),
            'getRequestUri' => $request->getRequestUri(),
            'getQueryString' => $request->getQueryString(),
            'QUERY_STRING' => $request->server->get('QUERY_STRING'),
        );

        // 追記) 
        parse_str($result['QUERY_STRING'], $result['params']);

        return json_encode($result, JSON_UNESCAPED_UNICODE);
    }
}

先ほどのリクエストでレスポンスを確かめてみましょう。

{
    "fullUrl": "http:\/\/localhost:8000\/api\/test?order=123&text=junban",
    "getRequestUri": "\/api\/test?text=junban&order=123",
    "getQueryString": "order=123&text=junban",
    "QUERY_STRING": "text=junban&order=123",
    "params": {
        "text": "junban",
        "order": "123"
    }
}

大丈夫そう

おわり

パラメータの順番変わってしまって困るケースは少ないと思いますが、「順番で条件変わる」とかだと注意が必要そうです。

文字列で取れちゃえばどうとでもなるが、、 んーいい感じの関数ないかね。

スポンサーリンク