Поскольку я хочу запускать конечные точки после принятия заголовка, я создал промежуточное программное обеспечение, чтобы определить, какая версия использует клиент:
// 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);
}
Затем я изменил пространство имен по умолчанию RouteServiceProvider
:
class RouteServiceProvider extends ServiceProvider {
// protected $namespace = 'App\Http\Controllers'; // default value
protected $namespace = null;
.
.
}
Наконец, в моем файле routes.php
у меня есть:
Route::group(['middleware' => 'api-version'], function()
{
Route::resource('items', 'App\Http\Controllers\{api}\ItemsController', ['only' => ['show', 'index', 'store', 'destroy']]);
});
Я попытался зарегистрировать промежуточное ПО в классе HttpKernel вместо группировки определений маршрутов, но это не сработало.
Мне было интересно, есть ли лучший способ добиться управления версиями API.
- Я хотел бы иметь файл
routes.php
для каждой версии:v1-routes.php
,v2-routes.php
и так далее. - Мне не нравится идея группировать определения маршрутов в
routes.php
только для того, чтобы получить доступ к значению{api}
. Есть ли другой способ узнать, какой контроллер я должен запустить?
Спасибо.