質問: お世話になっております。 当方Laravel5.5にてWebSiteを構築しております、 環境はmac OS Mojave10.14.2 ブラウザはGoogle Chrome バージョン: 71.0.3578.98になります。 ### 前提 データの検索結果画面(データがExcelの表のように一覧で見れる) を実装しました。(Laravel5.5でpaginationもLengthAwarePaginatorにて実装済) 一覧上の各レコードには「詳細」リンクがあり、 詳細画面に移ることができます。 ### やりたいこと 下記8の通り、 詳細から一覧に戻る際、 元いた画面(検索済で、かつ、同じページ)に戻りたいです。 1検索をかける(キーワード:teratail) 2キーワードteratailを持つデータがヒットし一覧表示される 3一覧の2ページ目に移る 42ページ目が表示される 5どのレコードかの詳細ボタンをクリックする 6詳細画面に移る 7戻るボタンをクリックする 8元いた4の画面に移る ### 考えたこと 詳細画面にキーワードと現在ページを渡し、戻ってくる時に 渡したキーワードを使用して再度検索、 元いたページ数をルーティングの機能の内のどこかに入れれば できるのでは?と考えました。 しかし、元いたページ数を渡した後、どのように そのページを指定して(どこに渡せば) 同じページに戻れるのかわからず困っています。 (元いた一覧ページは http://localhost:XXXX/show_data?keyword=teratail&page=2 のようになっていますが、文字列結合でpage=2をurl指定して 遷移させるなど乱暴なことをしてはいけない気がしていて、(感覚ですが...) 踏み込めずにいます) 一覧画面のview(詳細リンク部分) $data->currentPage()がページネーションの現在ページになります ``` 詳細 ``` この後は、Controllerでリクエストから変数(keywordとpreviouspage)を取ってそのまま詳細画面に渡しています。 詳細画面のview(戻るボタン) ``` {{ csrf_field() }} 戻る ``` この後、一覧画面のコントローラーでは、keywordからデータベースの検索をして、 一覧を表示するようにしているので、 現在渡ってきたpreviouspageは使えていません。 ルーティング ``` Route::get('/show_data', 'ShowdataController@show_data_searched')->name('show_data')->middleware('auth'); Route::post('/show_data', 'ShowcaseController@show_data_searched')->name('show_data')->middleware('auth'); Route::get('/show_data_detail', 'ShowdataController@show_data_detail')->name('show_data_detail')->middleware('auth'); ``` ### 気になっていること 対象のページを初めて見た時や、 新しいページ、新しいタブで開いた時などは 直前に見たページを取得できないことが理由で、 url()->previous()を他のページ(データのアップロード画面など)で 使っていなかったため、今回も使用していません。 しかし、 そもそもurl()->previous()にエラーページを設定すれば問題ないので、 (参考:https://www.nyamucoro.com/entry/2018/05/09/200600) 前ページへの移動は上記の「考えたこと」の様に再検索など行わないのが普通、 であればご指摘頂けますとありがたいです。 ### 追記(3/29 15:07) paging後のデータのcurrentPageを 上書きしてviewに渡せればよいかと考え、 方法を検索しましたが、 LengthAwarePaginatorにて (記載が漏れていたため前提項にも追記しました) setcurrentPage()といったメソッドはない(※)ようで、 "overwrite current page laravel pagination" "overwrite current page LengthAwarePaginator" "LengthAwarePaginator method" といったキーワードで検索するもなかなか方法がみつかりません。 ※参考:https://laravel.com/api/5.0/Illuminate/Pagination/LengthAwarePaginator.html 宜しくお願い致します。
回答: ルーティング・URLに持って回るのは賢明とは言えません。 原則として現在の画面に表示されている以外の情報を持ってはいけません。 REQUESTを取得する際にキーが被ってしまうこともあるからです。 セッションに持っておいて適宜引き出すと良いです。