2

APIバージョンがヘッダーを介して渡されるLaravel 5.1でRestful APIを構築するのに忙しいです。このようにして、ルート グループ全体をコピーして貼り付けてバージョン番号をインクリメントするのではなく、機能をバージョン管理できます。

私が抱えている問題は、IEのバージョン管理されたメソッドが欲しいということです:

public function store_v1 (){  }

ヘッダーからバージョンをキャプチャするルートにミドルウェアを追加しましたが、コントローラーから正しいメソッドを選択するようにリクエストを変更する必要があります。

アプリ/Http/routes.php

Route::group(['middleware' => ['apiversion']], function()
{
    Route::post('demo', 'DemoController@store');
}

アプリ/Http/ミドルウェア/ApiVersionMiddleware.php

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

    //  dd($action)
    //  returns "App\Http\Controllers\DemoController@store"
}

ここからは、ヘッダー バージョンを $action にアタッチし、それを $request に渡して、正しいメソッドに到達するようにします。

まあ、それはとにかく理論です。

ルートにアクションを挿入する方法についてのアイデアはありますか?

4

2 に答える 2

6

ミドルウェアはそれを行うのに最適な場所ではないかもしれません. ルートにアクセスできますが、呼び出されるコントローラー メソッドを変更する方法はありません。

より簡単なオプションは、リクエストとルートに基づいてコントローラー メソッドを呼び出すロジックを処理するカスタム ルート ディスパッチャーを登録することです。次のようになります。

<?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 に登録します。

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

このようにして、デフォルトのルート ディスパッチャーを独自のルート ディスパッチャーで上書きし、コントローラー メソッド名の末尾にリクエスト ヘッダーから取得したバージョンを追加します。

于 2015-07-21T16:01:56.440 に答える