2016-05-19 11 views
0

Ich möchte mit dem Parameter in einer Routen-URL auf einen Controller-Namespace zugreifen. Ist so etwas möglich?Laravel Controller/Namespace über Routenparameter

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

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

So

api/v1/clients/example/test 

Würde die TestController Klasse mit Namespace My\Name\Space\example\Controllers laufenden Verfahren test

laden Da ich Laravel bin mit (und ein Paket zu schreiben - so ein Serviceprovider verwenden) würde ich glaube, es ist irgendwo Ich könnte in/override (und manipulieren) den URL-Parameter vor der Logik für die Entscheidung, die Controller und Controller-Methoden zugewiesen sind ed.

Ich möchte dies mit einigen Routen tun.

Antwort

1

Zuerst ist es am besten mit der RouteServiceProvider im App\Providers Namespace zu beginnen. Sie werden feststellen, dass routes.php in einer Routengruppe enthalten ist, die einen Namespace zu App\Http\Controllers definiert. Wenn Sie einen anderen Namespace verwenden möchten, empfiehlt es sich, dies zu überschreiben und entweder Routen im Service Provider zu definieren oder die Wrapping-Gruppe zu ändern und routes.php zu verwenden.

Um das gewünschte Ergebnis zu erhalten, müssen Sie das clientId aus dem Anfrageobjekt abrufen, bevor Sie die Controller erstellen. Für Befehle, die kein Anforderungsobjekt haben (artisan route:list), ist es immer am besten, dies ebenfalls zu übernehmen. Beachten Sie, dass dies ungetestet ist. Wenn Request::route immer Null und Standardwerte zurückgibt, können Sie stattdessen segment() verwenden, um ein bestimmtes URL-Fragment zu erhalten.

** 
* 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'); 
    }); 
} 

Jetzt in Ihrem routes.php Sie eine Gruppe nicht brauchen würde, nur die Bindungen, wie Sie sie haben.

// The controller at namespace App\{clientId}\ will be used 
Route::get('clients/{clientId}/test', '[email protected]'); 
Verwandte Themen