为 Lumen 中的所有路由添加前缀

Prefix all the routes in Lumen

在 Lumen 中有没有办法为我的所有路由添加前缀?

问题是我正在通过 URI 对 API 进行版本控制,对于我创建的每个组,我都必须将前缀设置为 'v1/*',例如:

$app->group(['prefix' => 'v1/students/', 'namespace' => 'App\Http\Controllers\Students\Data'], function () use ($app) {
    $app->get('/', 'StudentController@get');
    $app->get('/{id}', 'StudentController@getByID');
});

显然,Lumen 中的路由组不继承任何设置,这是为了让路由器更简单、更快(see comment here)。

最好的办法可能是为每个版本创建一个路由组,以便为​​该版本定义基本前缀和控制器名称空间。但是,这些路由组中的各个路由需要稍微详细一些。示例如下:

// creates v1/students, v1/students/{id}
$app->group(['prefix' => 'v1', 'namespace' => 'App\Http\Controllers'], function () use ($app) {
    $app->get('students', 'Students\Data\StudentController@get');
    $app->get('students/{id}', 'StudentController@getByID');
});

// creates v2/students, v2/students/{id}, v2/teachers, v2/teachers/{id}
$app->group(['prefix' => 'v2', 'namespace' => 'App\Http\Controllers'], function () use ($app) {
    $app->get('students', 'Students\Data\StudentController@get');
    $app->get('students/{id}', 'Students\Data\StudentController@getByID');

    $app->get('teachers', 'Teachers\Data\TeacherController@get');
    $app->get('teachers/{id}', 'Teachers\Data\TeacherController@getByID');
});

您可以在 /bootstrap/app.php 中为所有路由添加前缀。 目前,应该有类似

的东西
# may be slighlty different, since I typed this from memory
$app->router->group([
    'namespace' => 'App\Http\Controllers',
], function ($router) {
    require __DIR__ . '/../routes/web.php';
});

如您所见,这会加载 web.php 文件并使 $router 变量可用。 您可以重写它以加载路由目录中的任何 php 文件,并通过

为所有这些路由添加前缀
$app->router->group([
    'namespace' => 'App\Http\Controllers',
], function ($router) {
    // load all files in routes directory, prefix all of them
    $globalPrefix =  "/v1";
    $router->group(["prefix" => $globalPrefix], function($router) {
        $routes = glob(__DIR__ . '/../routes/*.php');

        foreach ($routes as $route) require $route;
    });
});

如您所见,所有必需的路由都包含在 $router->group 中,并带有您的应用程序范围的路由前缀。