<?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);
}
}