はじめに
一番簡単な方法は、クエリビルダとEloquent queryへpaginateメソッドを使う方法ですが、
今回は、渡された配列を元にして、ペジネーションインスンタンスを作成して見ました。
誤った書き方や理解の仕方をしていた場合は、ご指摘いただきますと幸いです!
laravelのバージョンは5.6です。
出来上がりイメージ
よく見るデザインに仕上げてくれます。
実装
-
getItemCollectionPaginator
の引数にある$requestUrl
と$currentPageNo
は
リクエストから現在のページとリクエストURLをController側で受け取ってきたものになります。 -
self::DISPLAY_ITEM_FOR_PAGENATION
でリストの最大表示件数を決めています。 -
$this->itemRepositoryInterface->getItemCollection()->toArray()
は
リポジトリパターンを利用し、画面に表示するデータを配列で全件取得しています。 -
そして本題である
LengthAwarePaginator
の引数には下記のデータを引数に与えます。-
1ページに表示するデータ※1
-
全てのページを合わせた全件数
-
1ページに表示する数
-
現在のページ番号
-
ページネーション押下時のURL
( ※1 ぺジネーターに渡す結果の配列を自分で"slice"する必要があるため、
array_chunkメソッドを使って配列を分割しています。) -
/**
* @param string $requestUrl
* @param string $currentPageNo
* @return LengthAwarePaginator
*/
public function getItemCollectionPaginator(string $requestUrl, string $currentPageNo = null): LengthAwarePaginator
{
//配列を1ページに表示する件数分分割する
$displayData = array_chunk($this->itemRepositoryInterface->getItemCollection()->toArray(),
self::DISPLAY_ITEM_FOR_PAGENATION);
//ページがnullの場合は1を設定
if (is_null($currentPageNo)) {
$currentPageNo = 1;
}
return new LengthAwarePaginator(
$displayData[$currentPageNo-1], //該当ページに表示するデータ
count($this->itemRepositoryInterface->getItemCollection()->toArray()), //全件数
self::DISPLAY_ITEM_FOR_PAGENATION, //1ページに表示する数
$currentPageNo, //現在のページ番号
['path' => $requestUrl] //URLをオプションとして設定
);
}
- 最後にペジネーション結果の表示はbladeで以下のように実装します。
linksメソッドで結果の残りのページヘのリンクをレンダーしています。
@if($paginator->total() > 0)
<nav aria-label="ページネーション">
<div class="pagination mx-auto my-4">
{{ $paginator->links() }}
</div>
</nav>
@endif
paginateメソッドを呼び出す場合
Illuminate\Pagination\LengthAwarePaginatorインスタンスを受け取っており、
結果を表す多くのメソッドが提供されています。
結果を取得したらその結果とページリンクをBladeを使って表示できます!
まとめ
初期表示時時に1ページ目が表示されて欲しかったのですが、
初期表示時のページ番号はnullで入ってくるため
nullの場合は無理やり1ページ目としている部分がどうにかできないかなと
思っています。。
リクエストの受け取り方や配列の分割方法も改善できそうなので
何かアドバイスがあればいただきたいです!