【问题标题】:Laravel controllers / namespace via route parameterLaravel 控制器/命名空间通过路由参数
【发布时间】:2016-05-19 11:57:51
【问题描述】:

我想使用路由 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 运行方法test 加载TestController

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

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

【问题讨论】:

    标签: php laravel laravel-5.2 laravel-routing


    【解决方案1】:

    首先,最好从位于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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-05
      • 2018-05-05
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多