annotate core/modules/jsonapi/src/Query/OffsetPage.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents
children
rev   line source
Chris@5 1 <?php
Chris@5 2
Chris@5 3 namespace Drupal\jsonapi\Query;
Chris@5 4
Chris@5 5 use Drupal\Core\Cache\CacheableMetadata;
Chris@5 6 use Drupal\Core\Http\Exception\CacheableBadRequestHttpException;
Chris@5 7
Chris@5 8 /**
Chris@5 9 * Value object for containing the requested offset and page parameters.
Chris@5 10 *
Chris@5 11 * @internal JSON:API maintains no PHP API since its API is the HTTP API. This
Chris@5 12 * class may change at any time and this will break any dependencies on it.
Chris@5 13 *
Chris@5 14 * @see https://www.drupal.org/project/jsonapi/issues/3032787
Chris@5 15 * @see jsonapi.api.php
Chris@5 16 */
Chris@5 17 class OffsetPage {
Chris@5 18
Chris@5 19 /**
Chris@5 20 * The JSON:API pagination key name.
Chris@5 21 *
Chris@5 22 * @var string
Chris@5 23 */
Chris@5 24 const KEY_NAME = 'page';
Chris@5 25
Chris@5 26 /**
Chris@5 27 * The offset key in the page parameter: page[offset].
Chris@5 28 *
Chris@5 29 * @var string
Chris@5 30 */
Chris@5 31 const OFFSET_KEY = 'offset';
Chris@5 32
Chris@5 33 /**
Chris@5 34 * The size key in the page parameter: page[limit].
Chris@5 35 *
Chris@5 36 * @var string
Chris@5 37 */
Chris@5 38 const SIZE_KEY = 'limit';
Chris@5 39
Chris@5 40 /**
Chris@5 41 * Default offset.
Chris@5 42 *
Chris@5 43 * @var int
Chris@5 44 */
Chris@5 45 const DEFAULT_OFFSET = 0;
Chris@5 46
Chris@5 47 /**
Chris@5 48 * Max size.
Chris@5 49 *
Chris@5 50 * @var int
Chris@5 51 */
Chris@5 52 const SIZE_MAX = 50;
Chris@5 53
Chris@5 54 /**
Chris@5 55 * The offset for the query.
Chris@5 56 *
Chris@5 57 * @var int
Chris@5 58 */
Chris@5 59 protected $offset;
Chris@5 60
Chris@5 61 /**
Chris@5 62 * The size of the query.
Chris@5 63 *
Chris@5 64 * @var int
Chris@5 65 */
Chris@5 66 protected $size;
Chris@5 67
Chris@5 68 /**
Chris@5 69 * Instantiates an OffsetPage object.
Chris@5 70 *
Chris@5 71 * @param int $offset
Chris@5 72 * The query offset.
Chris@5 73 * @param int $size
Chris@5 74 * The query size limit.
Chris@5 75 */
Chris@5 76 public function __construct($offset, $size) {
Chris@5 77 $this->offset = $offset;
Chris@5 78 $this->size = $size;
Chris@5 79 }
Chris@5 80
Chris@5 81 /**
Chris@5 82 * Returns the current offset.
Chris@5 83 *
Chris@5 84 * @return int
Chris@5 85 * The query offset.
Chris@5 86 */
Chris@5 87 public function getOffset() {
Chris@5 88 return $this->offset;
Chris@5 89 }
Chris@5 90
Chris@5 91 /**
Chris@5 92 * Returns the page size.
Chris@5 93 *
Chris@5 94 * @return int
Chris@5 95 * The requested size of the query result.
Chris@5 96 */
Chris@5 97 public function getSize() {
Chris@5 98 return $this->size;
Chris@5 99 }
Chris@5 100
Chris@5 101 /**
Chris@5 102 * Creates an OffsetPage object from a query parameter.
Chris@5 103 *
Chris@5 104 * @param mixed $parameter
Chris@5 105 * The `page` query parameter from the Symfony request object.
Chris@5 106 *
Chris@5 107 * @return \Drupal\jsonapi\Query\OffsetPage
Chris@5 108 * An OffsetPage object with defaults.
Chris@5 109 */
Chris@5 110 public static function createFromQueryParameter($parameter) {
Chris@5 111 if (!is_array($parameter)) {
Chris@5 112 $cacheability = (new CacheableMetadata())->addCacheContexts(['url.query_args:page']);
Chris@5 113 throw new CacheableBadRequestHttpException($cacheability, 'The page parameter needs to be an array.');
Chris@5 114 }
Chris@5 115
Chris@5 116 $expanded = $parameter + [
Chris@5 117 static::OFFSET_KEY => static::DEFAULT_OFFSET,
Chris@5 118 static::SIZE_KEY => static::SIZE_MAX,
Chris@5 119 ];
Chris@5 120
Chris@5 121 if ($expanded[static::SIZE_KEY] > static::SIZE_MAX) {
Chris@5 122 $expanded[static::SIZE_KEY] = static::SIZE_MAX;
Chris@5 123 }
Chris@5 124
Chris@5 125 return new static($expanded[static::OFFSET_KEY], $expanded[static::SIZE_KEY]);
Chris@5 126 }
Chris@5 127
Chris@5 128 }