結論
こんなヘルパ関数作らなくても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.json
のautoload -> 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>
<!-- [略] -->
所感
ちなみに個人的にハマった、ページネーション時にパラメータが引き継げない問題については こちら をご覧ください。