makedo/php-paginator

Data source independent paginator for php

1.0.2 2019-09-05 07:59 UTC

This package is auto-updated.

Last update: 2024-05-05 19:09:00 UTC


README

This is yet another paginator for php. Main idea of this package is to build data source independent paginator, which has an ability to work in several modes:

  • Count skip by id

        $loader = function (int $limit, int $skip): iterable
        {
            //SELECT * from users  WHERE id > $skip LIMIT $limit
        };
        
        $perPage = 100;
        $lastIdOnPreviousPage = 34;
        
        $paginatorFactory = new SkipById($perPage);
      
        $page = $paginatorFactory
            ->createPaginator(new CallableLoader($loader), $lastIdOnPreviousPage)
            ->paginate()
        ;

    In this example you have an ability use id as skip value. As you can see, Loader function accepts id in $skip variable. It should be id of last item on previous page and it comes from client side. For 1st page it should be 0. For $page->hasNext paginator will load $perPage + 1 item, and then check if actual count of loaded items is more than $perPage.

    Optionally, you can set $currentPage value, which will be set to $page->currentPage.

  • Count skip by id with total count

       $loader = function (int $limit, int $skip): iterable {
           //SELECT * from users  WHERE id > $skip LIMIT
       };
      
       $counter = function (): int {
           //SELECT count(id) from users
       };
       
       $perPage = 100;
       $lastIdOnPreviousPage = 35;
       
       $paginatorFactory = new SkipByIdCountable($perPage);
       $page = $paginatorFactory
           ->createPaginator(
               new CallableLoader($loader),
               new CallableCounter($counter),
               $lastIdOnPreviousPage
           )
           ->paginate()
       ;

    In above example paginator counts skip by id and uses total count for $page->total, $page->totalPages values. For $page->hasNext paginator will load $perPage + 1 item, and then check if actual count of loaded items is more than $perPage.

  • Count skip by id with total count and current page

       $loader = function (int $limit, int $skip): iterable {
           //SELECT * from users  WHERE id > $skip LIMIT
       };
      
       $counter = function (): int {
           //SELECT count(id) from users
       };
       
       $perPage = 100;
       $lastIdOnPreviousPage = 35;
       $currentPage = 4;
       
       $paginatorFactory = new SkipByIdCountable($perPage);
       $page = $paginatorFactory
           ->createPaginator(
               new CallableLoader($loader),
               new CallableCounter($counter),
               $lastIdOnPreviousPage,
               $currentPage
           )
           ->paginate()
       ;

    In above example paginator counts skip by id and uses total count for $page->total, $page->totalPages, $page->hasNext values. In this case, we know $currentPage value, which in real case comes from client, so we can use total count and $currentPage for counting $page->hasNext except using $perPage + 1 strategy.

  • Count skip by offset

    $loader = function (int $limit, int $skip): iterable
    {
        //SELECT * from users LIMIT $limit OFFSET $skip
    };
    
    $perPage = 100;
    $currentPage = 2;
    
    $paginatorFactory = new SkipByOffset($perPage);
    
    $page = $paginatorFactory
        ->createPaginator(new CallableLoader($loader), $currentPage)
        ->paginate()
    ;

    In above example paginator counts skip as offset according to $perPage and $currentPage values. For counting $page->hasNext paginator will load $perPage + 1 item, and then check if actual count of loaded items is more than $perPage.

    • Count skip by offset and use total count

         $loader = function (int $limit, int $skip): iterable {
             //SELECT * from users LIMIT $limit OFFSET $skip
         };
        
         $counter = function (): int {
             //SELECT count(id) from users
         };
         
         $perPage = 100;
         $currentPage = 2;
         
         $paginatorFactory = new SkipByOffsetCountable($perPage);
      
         $page = $paginatorFactory
             ->createPaginator(new CallableLoader($loader), new CallableCounter($counter), $currentPage)
             ->paginate()
         ;

      In above example paginator counts skip by offset and uses total count for $page->total, $page->totalPages, $page->hasNext values.