検索機能を実装する際に出会ったアンチパターンをご紹介します。
1. 検索フォームが POST メソッド
<form method="POST" action="https://example.com/search">
<!-- ... -->
<button type="submit">検索</button>
</form>
通常、検索機能は「読み取り」操作であり、GETメソッドの使用が推奨されます。
GET メソッドを使うと以下の利点があります。
- ブックマーク可能:
GET
リクエストはURLにクエリパラメータを含められるので、ブックマークやリンクの共有が容易になる - キャッシュ可能: ブラウザやサーバーが
GET
リクエストの結果をキャッシュでき、パフォーマンス向上が期待できる
2. 検索条件をセッションに入れて、リダイレクトして検索結果画面を表示
public function search(Request $request): RedirectResponse
{
$request->session()->put('search.query', $request->all());
return redirect()->route('result');
}
public function result(Request $request): View
{
$query = $request->session()->get('search.query');
$result = xxx; // 検索処理
return view('result', $result);
}
1で POST
しているからか検索結果画面をリダイレクトして表示していました。
検索条件をセッションに入れて、検索結果画面を表示する際にセッションから検索条件を取り出し、実際にデータベースへアクセスしていました。
- 別タブで検索すると検索条件が上書きされる
- セッションからの値の出し入れがめんどくさい
3. 一意にならないソートキーが指定されている
ORDER BY句に 投稿日
カラムがキーに指定されていました。
ただ、検証環境に同じ日時の 投稿日
データが大量に入っていました。
ページャー機能により2ページ目、3ページ目を表示するも1ページ目で表示したアイテムが再度表示されてしまう
まとめ
検索機能を実装するときは GET
メソッドを使おう
今日はこちらのイベントに参加しました。
この時の自己紹介で「今まで作った検索機能の思い出」を語ることになり、思い出を思い出したついでに記事として供養したいと思います。