Since I want to fire endpoints upon accept header, I created a middleware to identify which version is using the client:
// ApiVersionMiddleware
public function handle($request, Closure $next)
{
$route = $request->route();
$actions = $route->getAction();
$actions['uses'] = str_replace(
'{api}',
$request->header('api-version'),
$actions['uses']
);
$route->setAction($actions);
return $next($request);
}
I then changed the default RouteServiceProvider
namespace:
class RouteServiceProvider extends ServiceProvider {
// protected $namespace = 'App\Http\Controllers'; // default value
protected $namespace = null;
.
.
}
Finally, in my routes.php
file, I have:
Route::group(['middleware' => 'api-version'], function()
{
Route::resource('items', 'App\Http\Controllers\{api}\ItemsController', ['only' => ['show', 'index', 'store', 'destroy']]);
});
I tried to register the middleware in the HttpKernel class instead of grouping route definitions but it did not work.
I was wondering if there is a better way to achieve API versioning.
- I would like to have a
routes.php
file for each version:v1-routes.php
,v2-routes.php
and so on. - I don't like the idea of grouping my route definitions in the
routes.php
just to get access to the{api}
value. Is any other way to find out which Controller should I fire?
Thanks.