Laravel 通过路由参数的控制器/命名空间
Laravel controllers / namespace via route parameter
我想使用路由 URL 中的参数访问控制器名称-space。这样的事情可能吗?
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
将加载 TestController
class 名称 space My\Name\Space\example\Controllers
运行 方法 test
因为我正在使用 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');
我想使用路由 URL 中的参数访问控制器名称-space。这样的事情可能吗?
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
将加载 TestController
class 名称 space My\Name\Space\example\Controllers
运行 方法 test
因为我正在使用 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');