This is a simple component for CakePHP 4 which injects pagination information from CakePHP's Paginator into serialized JsonView and XmlView responses.
Via Composer
$ composer require bcrowe/cakephp-api-pagination
Load the plugin by adding $this->addPlugin('BryanCrowe/ApiPagination');
to the bootsrap
method in your project’s src/Application.php
:
public function bootstrap(): void
{
parent::bootstrap();
// ... bootstrap code ...
// load more plugins here
$this->addPlugin('BryanCrowe/ApiPagination');
}
Make sure your application has been set up to use data views; see the Enabling Data Views in Your Application section of the CakePHP documentation.
Then, load ApiPaginationComponent
:
$this->loadComponent('BryanCrowe/ApiPagination.ApiPagination');
Then, go ahead and set your paginated view variable like so:
$this->set('articles', $this->paginate($this->Articles));
$this->viewBuilder()->setOption('serialize', ['articles']);
Note: It is important that your serialize
option is an array, e.g.
['articles']
, so that your pagination information can be set under its own
pagination key.
Your JsonView and XmlView responses will now contain the pagination information, and will look something like this:
{
"articles": ["...", "...", "..."],
"pagination": {
"finder": "all",
"page": 1,
"current": 20,
"count": 5000,
"perPage": 20,
"prevPage": false,
"nextPage": true,
"pageCount": 250,
"sort": null,
"direction": false,
"limit": null,
"sortDefault": false,
"directionDefault": false
}
}
ApiPagination has four keys for configuration: key
, aliases
, visible
and model
.
-
key
allows you to change the name of the pagination key. -
aliases
allows you to change names of the pagination detail keys. -
visible
allows you to set which pagination keys will be exposed in the response. Note: Whenever setting a key's visibility, make sure to use the aliased name if you've given it one. -
model
allows you to set the name of the model the pagination is applied on if the controller does not follow CakePHP conventions, e.g.ArticlesIndexController
. Per default the model is the name of the controller, e.g.Articles
forArticlesController
.
An example using all these configuration keys:
$this->loadComponent('BryanCrowe/ApiPagination.ApiPagination', [
'key' => 'paging',
'aliases' => [
'page' => 'currentPage',
'current' => 'resultCount'
],
'visible' => [
'currentPage',
'resultCount',
'prevPage',
'nextPage'
],
'model' => 'Articles',
]);
This configuration would yield:
{
"articles": ["...", "...", "..."],
"paging": {
"prevPage": false,
"nextPage": true,
"currentPage": 1,
"resultCount": 20
}
}
Please see CHANGELOG for more information what has changed recently.
$ composer test
Please see CONTRIBUTING and CONDUCT for details.
If you discover any security related issues, please email bryan@bryan-crowe.com instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.