you can use this package easily with laravel FormRequests. Out of the box the package will parse and validate query-parameters for sorting and paginating based on the JSON:API specification.
The configuration file can be published using php artisan vendor:publish
return [
/**
* @see https://jsonapi.org/format/1.1/#fetching-filtering
*/
'key' => 'filter', /** The key used as query-family for filtering. like filter[]= */
/**
* @see https://jsonapi.org/format/1.1/#fetching-pagination
*/
'pagination' => [
'auto' => true, /** automatically adds pagination to your filters if set to true */
'key' => 'page', /** The key used as query-family for sorting. like page[]= */
'limit' => 'size', /** The key used for query-family-member limit, like: page[size]=1 */
'offset' => 'number', /** The key used for query-family-member offset, like: page[number]=1 */
'defaults' => [
'limit' => 50, /** the default limit */
'max_limit' => 100 /** The maximum allowed limit */
]
],
/**
* @see https://jsonapi.org/format/1.1/#fetching-sorting
*/
'sorting' => [
'auto'=> true, /** automatically adds sorting to your filters if set to true */
'key'=> 'sort', /** the key used as query-family for sorting, like sort= */
]
];
In your FormRequest, you also have some control.
class YourFormRequest extends FormRequest {
protected bool $enablePagination = false; /** disable or enable pagination */
protected bool $enableSorting = false; /** disable or enable sorting */
protected array $allowedSorting = []; /** fields that are allowed for sorting */
protected array|string $defaultSort = []; /** default sort, can be a string or an array */
protected int $defaultLimit = 10; /** The default limit */
protected int $maxLimit = 50; /** The maximum allowed limit */
}
By default, the package does not allow any fields for sorting.
You have to add the fields you want to allow into the $allowedSorting
property.
The format is the same as specified in the
JSON:API specification: Sorting,
except it's listed as an array:
protected array $allowSorting = [
'animal', /** ascending */
'-animal' /** descending */
];
defaultSort
works the same way, except it is allowed to be a string.
To add your own filters, simply add the following method in your FormRequest.
You can use filter
, filterArray
and hasFilter
methods as shortcut to the filter
query parameter family as specified in JSON:API specification: Filtering
The filterArray
method makes sure the result is always returned as an array, so you can pass a comma separated
string in your filter['animals]
as per recommendation or an array.
private function filters(Query $query): void
{
if($this->hasFilter('animal')) {
$query->is('animal_field', $this->filter('animal'));
}
if($this->hasFilter('animals')) {
$query->in('animal_field', $this->filterArray('animals'));
}
}
Note: You need to add your own validations in your rules method.