| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- <?php
- namespace Illuminate\Pagination;
- use Illuminate\Contracts\Support\Arrayable;
- use UnexpectedValueException;
- class Cursor implements Arrayable
- {
- /**
- * The parameters associated with the cursor.
- *
- * @var array
- */
- protected $parameters;
- /**
- * Determine whether the cursor points to the next or previous set of items.
- *
- * @var bool
- */
- protected $pointsToNextItems;
- /**
- * Create a new cursor instance.
- *
- * @param array $parameters
- * @param bool $pointsToNextItems
- */
- public function __construct(array $parameters, $pointsToNextItems = true)
- {
- $this->parameters = $parameters;
- $this->pointsToNextItems = $pointsToNextItems;
- }
- /**
- * Get the given parameter from the cursor.
- *
- * @param string $parameterName
- * @return string|null
- *
- * @throws \UnexpectedValueException
- */
- public function parameter(string $parameterName)
- {
- if (! array_key_exists($parameterName, $this->parameters)) {
- throw new UnexpectedValueException("Unable to find parameter [{$parameterName}] in pagination item.");
- }
- return $this->parameters[$parameterName];
- }
- /**
- * Get the given parameters from the cursor.
- *
- * @param array $parameterNames
- * @return array
- */
- public function parameters(array $parameterNames)
- {
- return collect($parameterNames)->map(function ($parameterName) {
- return $this->parameter($parameterName);
- })->toArray();
- }
- /**
- * Determine whether the cursor points to the next set of items.
- *
- * @return bool
- */
- public function pointsToNextItems()
- {
- return $this->pointsToNextItems;
- }
- /**
- * Determine whether the cursor points to the previous set of items.
- *
- * @return bool
- */
- public function pointsToPreviousItems()
- {
- return ! $this->pointsToNextItems;
- }
- /**
- * Get the array representation of the cursor.
- *
- * @return array
- */
- public function toArray()
- {
- return array_merge($this->parameters, [
- '_pointsToNextItems' => $this->pointsToNextItems,
- ]);
- }
- /**
- * Get the encoded string representation of the cursor to construct a URL.
- *
- * @return string
- */
- public function encode()
- {
- return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode(json_encode($this->toArray())));
- }
- /**
- * Get a cursor instance from the encoded string representation.
- *
- * @param string|null $encodedString
- * @return static|null
- */
- public static function fromEncoded($encodedString)
- {
- if (is_null($encodedString) || ! is_string($encodedString)) {
- return null;
- }
- $parameters = json_decode(base64_decode(str_replace(['-', '_'], ['+', '/'], $encodedString)), true);
- if (json_last_error() !== JSON_ERROR_NONE) {
- return null;
- }
- $pointsToNextItems = $parameters['_pointsToNextItems'];
- unset($parameters['_pointsToNextItems']);
- return new static($parameters, $pointsToNextItems);
- }
- }
|