LoginSignup
4
5

More than 5 years have passed since last update.

[Laravel] 一度に固定パラメータとクエリパラメータを引き渡せるヘルパ関数を作ったが徒労に終わった話

Last updated at Posted at 2018-02-22

結論

こんなヘルパ関数作らなくてもformのメソッドをGETで送ればクエリパラメータ引き渡しは簡単だということに執筆中に気づくという。盲点。

思ったこと

あれ?Laravelのヘルパ関数route()とかurl()とかってルートにつけた名前でルーティングできるからすっげー便利なのに、固定パラメータとクエリパラメータを同時に流し込めなくねえ?って思った。
どちらか片方ずつなら行けるんだけど...いろいろ調べててもよくわかんない情報ばっかりだったので、自分でヘルパ関数作っちゃいました。

前提

ルーティング

app/Http/routes.php
Route::get('/groups/{group_id}{query_string?}', 'GroupController@index')
    ->name('group::show')
;

コントローラー

app/Http/Controllers/GroupController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class GroupController extends Controller
{
    public function show($group_id) {
        $querys = \Input::get();
        // ~~~
    }
    // [後略]
}

実装

ヘルパ関数

今回はappディレクトリ内にHelpersディレクトリを作って、その中に記述しました。

app/Helpers/helpers.php
<?php

if (!function_exists('route_with_query'))
{
    /**
     * 固定パラメータ、クエリパラメータを結合してルート名に沿ったルーティングを生成する関数
     * @param string $route_name   : [必須] ルート名。
     * @param array  $route_params : [任意] 固定パラメータ。連想一次配列で引き渡す。
     * @param array  $query_params : [任意] クエリパラメータ。連想一次配列であること。
     * @return string              : ルート名に固定パラメータを流し込み、クエリストリングを結合したものを返す。
     */
    function route_with_query($route_name, $route_params = [], $query_params = []) {
        // 固定パラメータがあった場合、固定ルートを生成する
        $static_route = (empty($route_params)) ? route($route_name) : route($route_name, $route_params);
        // クエリパラメータがあった場合、クエリストリング付きのルートを生成する
        return (empty($query_params)) ? $static_route : $static_route . '?' . http_build_query($query_params);
    }

}

composerに登録

このままだと毎回インクルードしないといけないので、composer.jsonautoload -> filesを作成(もしくは追記)してオートロードできるようにする。

composer.json
    "autoload" : {
        "classmap" : [
            "database"
        ],
        "files" : [
            "app/Helpers/helpers.php"
        ],
        "psr-4" : {
            "App\\" : "app/"
        }
    },

おまじないも忘れずに。

console
composer dump-autoload

実例

resources/views/groups/show.blade.php
<!-- [略] -->
<a href="{{ route_with_query('group::show', ['group_id' => $group_id], ['gender' => 'male', 'age' => 20]) }}">テスト</a>

<!-- 出力結果 -->
<a href="http://{host}/groups/6?gender=male&age=20">テスト</a>
<!-- [略] -->

所感

ちなみに個人的にハマった、ページネーション時にパラメータが引き継げない問題については こちら をご覧ください。

4
5
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
4
5