The route for pagination of articles
can be one, all the rest (page, limit) is captured via request()
with mandatory validation:
// routes\api.php Route::group(['prefix' => 'v1', 'namespace' => 'V1', 'middleware' => 'auth:api'], function() { Route::get('/articles', 'ArticlesController@index'); });
Write the scope for the model, you can put in the treit:
public function scopeAdvancedFilter($query) { $data = $this->validateAdvancedFilter(request()->all()); return $query->paginate($data['limit']); } protected function validateAdvancedFilter(array $request) { $request['limit'] = $request['limit'] ?? 15; $validator = validator()->make($request, [ 'limit' => 'sometimes|required|integer|min:5', 'page' => 'sometimes|required|integer|min:1', ]); return $validator->validate(); }
In the controller:
namespace App\Http\Controllers\Api\V1; use Illuminate\Http\Response; ... /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { $articles = Article::with([ 'categories:categories.id,categories.title,categories.slug', 'user:users.id,users.name', ]) ->advancedFilter(); $collection = ArticleResource::collection($articles); return $collection->response() ->setStatusCode(Response::HTTP_PARTIAL_CONTENT); } ...