はじめに
「依頼を探す」ページが表示される時は依頼の検索機能が、
そして「提案を探す」ページが表示される時には提案の検索機能が・・・
といったように、表示されるビューによって処理の内容を変えたい時は「三項演算子」を使うのが良いそうです。
『(expr1) ? (expr2) : (expr3) という式は、式1 が true の場合に 式2 を、 式1 が false の場合に 式3 を値とします。』(PHP公式ドキュメントより)
環境
PHP 8.2.7
Laravel 9.52.16
問題
- 検索フォームを実装しようとしている
- 提案・依頼の両方を検索できるようにしたい
- つまり、表示するビュー次第でルートを分岐させたい
commons.search_form.blade.php
{{-- 今はまだ依頼の検索しかできないが、将来的に提案の検索もできるようにしたい --}}
<div>
<form action="{{ route('sales-search') }}" method="GET" class="flex">
<input type="text" name="keyword" placeholder="キーワードで依頼を検索…" class="shadow appearance-none border rounded w-full py-1 px-2 text-gray-700 leading-tight focus:outline-none focus:shadow-outline mr-2">
<button type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-2 rounded focus:outline-none focus:shadow-outline">検索</button>
</form>
</div>
解決策
- 三項演算子を使う
commons.search_form.blade.php
{{-- これでアクセスするルートを分岐できる --}}
<div>
<form action="{{ $isSalesPage ? route('sales-search') : route('purchases-search') }}" method="GET" class="flex">
<input type="text" name="keyword" placeholder="キーワードで依頼を検索…" class="shadow appearance-none border rounded w-full py-1 px-2 text-gray-700 leading-tight focus:outline-none focus:shadow-outline mr-2">
<button type="submit" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-1 px-2 rounded focus:outline-none focus:shadow-outline">検索</button>
</form>
</div>
関係するコントローラ内で、論理値を持たせる$isSalesPageを定義することにより、
現在表示しているページが「依頼」ページか「提案」ページかを判断します。
もし依頼ページが表示されていたら依頼を検索するロジックを持つコントローラに、
逆に提案ページが表示されていたら提案を検索するロジックを持つコントローラにルーティングされるようになります。
参考に、依頼に関するコントローラはつぎのようになっています
SalesOrdersController.php(一部)
// 最初に表示される「依頼」のページ
public function othersSales()
{
$isSalesPage = true;
$user = Auth::user();
$othersSales = SalesOrder::where('user_id', '!=', Auth::id())->orderBy('created_at', 'desc')->paginate(10);
return view('sales.others_sales', [ // この先にsearch_form.blade.phpが@includeされている
'user' => $user,
'othersSales' => $othersSales,
'isSalesPage' => $isSalesPage,
]);
}
// $isSalesPageがtrueの時にルーティングされる
public function search(Request $request)
{
$isSalesPage = true;
$user = Auth::user();
$keyword = request('keyword');
$othersSales = SalesOrder::where('user_id', '!=', Auth::id())->where('title', 'like', "%{$keyword}%")->orderBy('created_at', 'desc')->paginate(10);
return view('sales.others_sales', [
'user' => $user,
'othersSales' => $othersSales,
'isSalesPage' => $isSalesPage,
]);
}
おわりに
分岐処理ができるところを、別のファイルを作ることで対応していた節もあるので、
これを機により効率的なコーディングを意識したいと思います。