Laravel控制器/命名空间通过路由参数


Laravel controllers / namespace via route parameter

我想使用路由URL中的参数访问控制器名称空间。这样的事情可能发生吗?

Route::group(['namespace' => 'My'Name'Space'{clientId}'Controllers', 'middleware' => 'api'], function () {
    Route::get('api/v1/clients/{clientId}/test', 'TestController@test');
});

所以

api/v1/clients/example/test

将加载命名空间为My'Name'Space'example'Controllers、运行方法testTestController

由于我正在使用laravel(并编写一个包,因此使用ServiceProvider),我认为在分配决定控制器和控制器方法的逻辑之前,有的地方我可以挂接/覆盖(并操纵)url参数。

我希望用相当多的路线来做到这一点。

首先,最好从位于App'Providers命名空间中的RouteServiceProvider开始。您会注意到routes.php包含在一个路由组中,该路由组定义了App'Http'Controllers的名称空间。如果您想使用不同的命名空间,那么最好覆盖它,并在服务提供程序中声明路由,或者修改包装组并使用routes.php

为了获得所需的结果,您需要在构建控制器之前从请求对象中获取clientId。对于没有请求对象(artisan route:list)的命令,最好也默认使用此对象。注意,这是未经测试的,如果Request::route总是返回null和默认值,则可以使用segment()来获取特定的url片段。

**
 * Define the routes for the application.
 *
 * @param  'Illuminate'Routing'Router  $router
 * @return void
 */
public function map(Router $router)
{
    // Attempt to get the route parameter clientId
    // or assign as Default
    $param = Request::route('clientId') ? : 'Default';
    $namespace = 'App''' . $param;
    $router->group([
        'namespace' => $namespace,
        'prefix' => 'api/v1/'
    ], function ($router) {
        // Ideally create a seperate apiroutes.php or something similar
        require app_path('Http/routes.php');
    });
}

现在,在routes.php中,您不需要组,只需要绑定即可。

// The controller at namespace App'{clientId}' will be used
Route::get('clients/{clientId}/test', 'AController@getTest');