CursorPaginator.php
TLDR
The CursorPaginator.php
file in the Illuminate\Pagination
namespace provides a class called CursorPaginator
that extends AbstractCursorPaginator
. This class implements several interfaces (Arrayable
, ArrayAccess
, Countable
, IteratorAggregate
, Jsonable
, JsonSerializable
, and PaginatorContract
) and contains methods for creating a new paginator instance, setting the items for the paginator, rendering the paginator, and determining if there are more items in the data source. The class also provides methods for determining if there are enough items to split into multiple pages, if the paginator is on the first or last page, and converting the paginator to an array or JSON representation.
Methods
__construct
This method creates a new CursorPaginator
instance. It takes in the items, the number of items per page, an optional cursor, and an array of options.
setItems
This method sets the items for the paginator.
links
This method renders the paginator using the given view.
render
This method renders the paginator using the given view.
hasMorePages
This method determines if there are more items in the data source.
hasPages
This method determines if there are enough items to split into multiple pages.
onFirstPage
This method determines if the paginator is on the first page.
onLastPage
This method determines if the paginator is on the last page.
toArray
This method returns the instance as an array.
jsonSerialize
This method converts the object into something JSON serializable.
toJson
This method converts the object to its JSON representation.
Classes
No classes are defined in this file.
<?php
namespace Illuminate\Pagination;
use ArrayAccess;
use Countable;
use Illuminate\Contracts\Pagination\CursorPaginator as PaginatorContract;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Support\Collection;
use IteratorAggregate;
use JsonSerializable;
class CursorPaginator extends AbstractCursorPaginator implements Arrayable, ArrayAccess, Countable, IteratorAggregate, Jsonable, JsonSerializable, PaginatorContract
{
/**
* Indicates whether there are more items in the data source.
*
* @return bool
*/
protected $hasMore;
/**
* Create a new paginator instance.
*
* @param mixed $items
* @param int $perPage
* @param \Illuminate\Pagination\Cursor|null $cursor
* @param array $options (path, query, fragment, pageName)
* @return void
*/
public function __construct($items, $perPage, $cursor = null, array $options = [])
{
$this->options = $options;
foreach ($options as $key => $value) {
$this->{$key} = $value;
}
$this->perPage = (int) $perPage;
$this->cursor = $cursor;
$this->path = $this->path !== '/' ? rtrim($this->path, '/') : $this->path;
$this->setItems($items);
}
/**
* Set the items for the paginator.
*
* @param mixed $items
* @return void
*/
protected function setItems($items)
{
$this->items = $items instanceof Collection ? $items : Collection::make($items);
$this->hasMore = $this->items->count() > $this->perPage;
$this->items = $this->items->slice(0, $this->perPage);
if (! is_null($this->cursor) && $this->cursor->pointsToPreviousItems()) {
$this->items = $this->items->reverse()->values();
}
}
/**
* Render the paginator using the given view.
*
* @param string|null $view
* @param array $data
* @return \Illuminate\Contracts\Support\Htmlable
*/
public function links($view = null, $data = [])
{
return $this->render($view, $data);
}
/**
* Render the paginator using the given view.
*
* @param string|null $view
* @param array $data
* @return \Illuminate\Contracts\Support\Htmlable
*/
public function render($view = null, $data = [])
{
return static::viewFactory()->make($view ?: Paginator::$defaultSimpleView, array_merge($data, [
'paginator' => $this,
]));
}
/**
* Determine if there are more items in the data source.
*
* @return bool
*/
public function hasMorePages()
{
return (is_null($this->cursor) && $this->hasMore) ||
(! is_null($this->cursor) && $this->cursor->pointsToNextItems() && $this->hasMore) ||
(! is_null($this->cursor) && $this->cursor->pointsToPreviousItems());
}
/**
* Determine if there are enough items to split into multiple pages.
*
* @return bool
*/
public function hasPages()
{
return ! $this->onFirstPage() || $this->hasMorePages();
}
/**
* Determine if the paginator is on the first page.
*
* @return bool
*/
public function onFirstPage()
{
return is_null($this->cursor) || ($this->cursor->pointsToPreviousItems() && ! $this->hasMore);
}
/**
* Determine if the paginator is on the last page.
*
* @return bool
*/
public function onLastPage()
{
return ! $this->hasMorePages();
}
/**
* Get the instance as an array.
*
* @return array
*/
public function toArray()
{
return [
'data' => $this->items->toArray(),
'path' => $this->path(),
'per_page' => $this->perPage(),
'next_cursor' => $this->nextCursor()?->encode(),
'next_page_url' => $this->nextPageUrl(),
'prev_cursor' => $this->previousCursor()?->encode(),
'prev_page_url' => $this->previousPageUrl(),
];
}
/**
* Convert the object into something JSON serializable.
*
* @return array
*/
public function jsonSerialize(): array
{
return $this->toArray();
}
/**
* Convert the object to its JSON representation.
*
* @param int $options
* @return string
*/
public function toJson($options = 0)
{
return json_encode($this->jsonSerialize(), $options);
}
}