master

laravel/framework

Last updated at: 29/12/2023 09:24

Cursor.php

TLDR

The Cursor.php file in the Illuminate\Pagination namespace defines a Cursor class that is responsible for managing and manipulating cursors used in pagination. The Cursor class implements the Arrayable interface and provides methods for creating, retrieving, and encoding cursors.

Methods

__construct

The __construct method is the constructor of the Cursor class. It initializes the cursor with the given parameters and sets the direction of the cursor (whether it points to the next or previous items).

parameter

The parameter method retrieves the value of a specific parameter from the cursor. It takes a parameter name as an argument and returns the corresponding parameter value. If the parameter does not exist, it throws an UnexpectedValueException.

parameters

The parameters method retrieves multiple parameters from the cursor. It takes an array of parameter names as an argument and returns an array of corresponding parameter values.

pointsToNextItems

The pointsToNextItems method determines whether the cursor points to the next set of items. It returns a boolean value indicating the direction of the cursor.

pointsToPreviousItems

The pointsToPreviousItems method determines whether the cursor points to the previous set of items. It returns a boolean value opposite to the pointsToNextItems method.

toArray

The toArray method returns the array representation of the cursor. It merges the cursor's parameters with an additional _pointsToNextItems key indicating the direction of the cursor.

encode

The encode method returns the encoded string representation of the cursor, which can be used to construct a URL. It base64 encodes the JSON representation of the cursor's array representation and replaces certain characters to make the string URL-safe.

fromEncoded

The fromEncoded method creates a Cursor instance from an encoded string representation. It takes an encoded string as an argument and returns a Cursor object if the decoding and JSON parsing are successful. If the input is not a string or the decoding fails, it returns null.

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