概要
古いlaravelやlaravel collectivだとBladeで使えるFormファサードにて、GETリクエストのクエリパラメーターを設定する際にめっちゃ詰まったので方法をまとめておく。
前提
クエリパラメーターを追加する前のbladeのコードを下記に記載する。
<div>
{{ Form::open(['route' => ['hoge.index'], 'method' => 'GET']) }}
{{ Form::input('text', 'search_word', null, []) }}
</div>
<div>
<a>
<button>
検索する
</button>
</a>
</div>
{{ Form::close() }}
結論
FormファサードでGETリクエストのクエリパラメーターを設定したい場合はForm::hidden('キー名', 値)
を使って指定する。
fuga_id=1
をクエリパラメーターに設定したい場合は下記のように設定する
<div>
{{ Form::open(['route' => ['hoge.index'], 'method' => 'GET']) }}
{{ Form::input('text', 'search_word', null, []) }}
{{ Form::hidden('fuga_id', 1 }}
</div>
<div>
<a>
<button>
検索する
</button>
</a>
</div>
{{ Form::close() }}
詰まったこと
ルートネームを使ってリンク先を指定し、クエリパラメーターを設定する場合は下記のようにする。
<a href="{{ route('hoge.index', ['fuga_id' => 1]) }}">
上記のように記載するとルートネームでURLパスが解決され末尾に?fuga_id=1
が設定される。
自分はFormファサードを使う場合も同様だと考え、下記の様にコードを修正していた。
<div>
{{ Form::open(['route' => ['hoge.index', 'fuga_id' => 1], 'method' => 'GET']) }}
{{ Form::input('text', 'search_word', null, []) }}
</div>
<div>
<a>
<button>
検索する
</button>
</a>
</div>
{{ Form::close() }}
ただ、この方法だとsearch_word
のクエリパラメーターは設定されるがfuga_id
のクエリパラメーターは設定されない。
下記の個々の状態でクエリパラメーターを確認したがfuga_id
のクエリパラメーターは確認できない。
- リクエストを受け取ったコントローラーでバリデーションチェックのために使っているリクエストクラス(HogeRequest)の内容を確認
- リクエストを受け取ったコントローラーでデフォルトのリクエストクラス(Request)の内容を確認
- リバプロのnginxのリクエストログの内容を確認
ただ逆に先に紹介したコードでレンダリングされた画面をchromeを使ってコードを確認すると生成されたformタグのactionのURLに?fuga_id=1
のクエリパラメーターが付与されたURLが設定されている。
そのためどこでクエリパラメーターが消失したのかが分からず詰まった。原因はそもそものコーディングミス。