2016-05-19 11 views
0

ルートURLのパラメータを使用してコントローラの名前空間にアクセスしたいとします。このようなことは可能でしょうか?私はそこに思うだろう - 私はlaravelを使用して(そうのServiceProviderを使用して、パッケージを書いて)おりますのでルートパラメータ経由の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 

は、名前空間My\Name\Space\example\Controllers実行する方法test

TestControllerクラスをロードするだろうどこかコントローラとコントローラメソッドを決定するロジックが割り当てられる前にurlパラメータをフックする/オーバーライドする(そして操作する)ことができましたed。

これはかなりのルートで行いたいと思っています。

答えて

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', '[email protected]');