get
でquery
を渡す方法
タイトルを見て、「そんなことも分からんのか」と思う方もいらっしゃると思います。
そうなんです、私はできなかったんです。
以下では、Laravel プロジェクトでシステム開発をしているときの
私の失敗と解決できた方法を記載していきます。
HTTP テスト
正しく動作するかをテストすることはとても重要です。
私もシステムが正しく動作するか、テストを書いており
検索機能が正しく動作しているか HTTP テストを書いていた時の話です。
テストの作成
よし、テストを作成するぞと意気込んで作成を開始しました。
まず、プロジェクトフォルダで、ターミナルを開きます。
$ cd test // 現在の階層のtest(フォルダ)に移動する
そして、ItemSearchTest
を作成します。
$ php artisan make:test ItemSearchTest
これでtest\Feature\ItemSearchTest.php
が生成されます。
さぁテストを書いていきましょう。
query
が渡せない
文字列検索は、get
メソッドで自己参照させてquery
で条件を与えていました。
そのため、以下のようなコードを書きました。
public function testGeneralPattern () {
$query = [
"keyword" => "〇〇",
];
$response = $this->get(route("item"),[
"query" => $query,
]);
}
実行してみると、NG のパターンが通らない。
中身を調べてみると、query
はまったく送られていませんでした。
ネットで調べた通りにHeader
の中に入れたのになぁ、と途方に暮れることになりました。
URL でもダメ
他に方法はないかと考えた結果、URL にquery
情報を入れ込む方法を試してみました。
public function testGeneralPattern () {
$url = "http://localhost/item?keyword=〇〇";
$response = $this->get($url);
}
これでもダメでした。
この時点で少し心は折れかけていました。
route()
長時間悩まされていましたが、解決のときが来ました。
「route()
の第二引数でquery
が渡せる」 という情報を手に入れたのです。
早速、試してみました。
public function testGeneralPattern () {
$query = [
"keyword" => "〇〇",
];
$response = $this->get(route("item", $query);
}
頼む!通ってくれ!!と願いを込めて、・・・・
ちゃんとquery
が渡せていました!
今月で一番ホッとした瞬間でした。
自己参照でquery
を引き継ぐ
検索機能だけでなく、ソート機能やタブ切替など
機能が増えてくると、現在のquery
を保持して自己参照したいと考えました。
上記でもあるように、route()
を使えばquery
を渡せることは分かっています。
あとは現在のquery
を取得する方法だけです。
Request::query()
現在のquery
を配列で取得するものです。
これが手に入ればあとはもう簡単でした。
<a href="{{ route('item', array_merge(Request::query(), ['tab' => '〇〇'])) }}">〇〇</a>
これで現在のquery
に与えたいquery
を追加した URLとなります。