2016-05-19 2 views
0

Я хочу получить доступ к имени контроллера с помощью параметра в URL маршрута. Что-то вроде этого возможно?Контроллеры Laravel/пространство имен через параметр маршрута

Route::group(['namespace' => 'My\Name\Space\{clientId}\Controllers', 'middleware' => 'api'], function() { 

    Route::get('api/v1/clients/{clientId}/test', '[email protected]'); 
}); 

Так

api/v1/clients/example/test 

бы загрузить TestController класс с пространством имен My\Name\Space\example\Controllers работает метод test

Поскольку я использую Laravel (и писать пакет - так что использование ServiceProvider) Я думаю, is где-то Я мог подключить/переопределить (и манипулировать) параметром url до того, как логика для решения контроллеров и методов контроллера назначит редактор

Я хочу сделать это с целым рядом маршрутов.

ответ

1

Для этого лучше всего начать с RouteServiceProvider, расположенного в пространстве имен App\Providers. Вы заметите, что 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', '[email protected]'); 
Смежные вопросы