2015-07-21 122 views
2

我正忙於在Laravel 5.1中構建一個Restful API,API版本通過頭部傳遞。這樣我就可以版本化功能,而不是複製和粘貼整個路由組並增加版本號。攔截Laravel路由

我遇到的問題是,我想有版本的方法,即:

public function store_v1(){ } 

我已經加入我的路線中間件,我捕獲來自頭的版本,但現在需要修改請求以從控制器中選擇正確的方法。

應用程序/ HTTP/routes.php文件

Route::group(['middleware' => ['apiversion']], function() 
{ 
    Route::post('demo', '[email protected]'); 
} 

應用程序/ HTTP /中間件/ ApiVersionMiddleware.php

public function handle($request, Closure $next) 
{ 
    $action = app()->router->getCurrentRoute()->getActionName(); 

    // dd($action) 
    // returns "App\Http\Controllers\[email protected]" 
} 

從現在起,我會附上頭版本到$操作,然後將它傳遞給$ request,以便它達到正確的方法。那麼,無論如何,這就是理論。

有關如何將動作注入到路由的任何想法?

回答

6

我認爲中間件可能不是最好的地方。您可以訪問路線,但它不會提供修改將要調用的控制器方法。

更簡單的選項是註冊一個自定義路由調度程序,該調度程序根據請求和路由處理調用控制器方法的邏輯。它可能看起來像:

public function register() { 
    $this->app->singleton('illuminate.route.dispatcher', VersionedRouteDispatcher::class); 
} 

通過這種方式,你會用自己的一個將後綴覆蓋缺省的路由調度員:

<?php 

class VersionedRouteDispatcher extends Illuminate\Routing\ControllerDispatcher { 
    public function dispatch(Route $route, Request $request, $controller, $method) 
    { 
    $version = $request->headers->get('version', 'v1'); // take version from the header 
    $method = sprintf('%s_%s', $method, $version); // create target method name 
    return parent::dispatch($route, $request, $controller, $method); // run parent logic with altered method name 
    } 
} 

一旦有了這種定製調度員,在你AppServiceProvider註冊它控制器方法名稱與從請求頭獲取的版本。

+0

Doe這仍然工作在Laravel 5.2? – gvhuyssteen

+0

不幸的是,這個方法在5.2中被刪除。請參閱http://stackoverflow.com/a/36779587/926953瞭解備用(但功能較弱)的選項。 – rabbitfang