7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

アイエンター #2Advent Calendar 2018

Day 8

laravel LengthAwarePaginatorで独自ペジネータ作成

Posted at

はじめに

一番簡単な方法は、クエリビルダとEloquent queryへpaginateメソッドを使う方法ですが、
今回は、渡された配列を元にして、ペジネーションインスンタンスを作成して見ました。
誤った書き方や理解の仕方をしていた場合は、ご指摘いただきますと幸いです!

laravelのバージョンは5.6です。

出来上がりイメージ

よく見るデザインに仕上げてくれます。

alt

実装

  • getItemCollectionPaginator の引数にある$requestUrl$currentPageNo
    リクエストから現在のページとリクエストURLをController側で受け取ってきたものになります。

  • self::DISPLAY_ITEM_FOR_PAGENATION でリストの最大表示件数を決めています。

  • $this->itemRepositoryInterface->getItemCollection()->toArray()
    リポジトリパターンを利用し、画面に表示するデータを配列で全件取得しています。

  • そして本題であるLengthAwarePaginatorの引数には下記のデータを引数に与えます。

    • 1ページに表示するデータ※1

    • 全てのページを合わせた全件数

    • 1ページに表示する数

    • 現在のページ番号

    • ページネーション押下時のURL

    ( ※1 ぺジネーターに渡す結果の配列を自分で"slice"する必要があるため、
    array_chunkメソッドを使って配列を分割しています。)

TopService.php
    /**
     * @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メソッドで結果の残りのページヘのリンクをレンダーしています。

index.blade.php

@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ページ目としている部分がどうにかできないかなと
思っています。。

リクエストの受け取り方や配列の分割方法も改善できそうなので
何かアドバイスがあればいただきたいです!

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?