4

Laravel 4 を使用してaccountname、各顧客が名前空間を持つ API を作成しています。各顧客は、独自の同一のデータベースを持っています。したがって、Foocorp は次のような API 呼び出しを行う必要があります。

http://api.example.com/Foocorp/users/5

Barcorp API 呼び出しは次のようになります

http://api.example.com/Barcorp/users/5

ビジネス/ブランディング上の理由から URL にアカウント名を含める必要があるため、URL ルートからこのパラメーターを削除することはできません。

これは、ルートからアカウント名を引き出し、それがアクティブであることを確認し、データベースを指すようにするために使用したフィルターです。accountnameすべてのコントローラー関数を記述して、すべてのパラメーターを含めないように、パラメーターを削除したいと考えてい$accountnameました。

Route::filter('accountverification', function()
{
    $route = Route::getCurrentRoute();
    $params = $route->getParameters();
    $accountName = $params['accountname'];

    // verify account with this name exists and set up DB connection to point to their database
    // ...

    unset($params['accountname']);
    $route->setParameters($params);
});

フィルタを使用するルート グループは次のとおりです。

Route::group(array('prefix' => '{accountname}', 'before' => 'accountverification'), function() {
    Route::get('users/{id}', 'UsersController@getShow')
        ->where(array('id' => '[0-9]+'));
});

問題は、フィルターのパラメーターを削除しても、コントローラー/関数が呼び出されたときに効果がないことです。UsersController::getShow 関数では、最初のパラメーターは常にaccountnameグループ プレフィックスからのものです。

関数に渡されないリクエストがディスパッチされる前に、すべてのルートに変数/パラメータを含める方法はありますか?

4

2 に答える 2

4

はい、できます。route 関数を使用しforgetParameter($parameter)て、パラメーターがコントローラーの引数に含まれないようにします。この関数は、laravel 4.1 以降で使用できます。あなたの例:

Route::filter('accountverification', function(Route $route)
{
    $params = $route->getParameters();
    $accountName = $params['accountname'];

// verify account with this name exists and set up DB connection to point to their database
// ...

    $route->forgetParameter('accountname');
});

たとえばlocale、ルート グループ内のすべてのコントローラー メソッドの引数として含まれないように、ルート内のパラメーターを忘れるためにこれを使用します。

http://laravel.com/api/4.2/Illuminate/Routing/Route.html#method_forgetParameter

必要に応じて更新しますので、今後このリンクが壊れた場合はコメントを残してください。

編集

Laravel 5 では、Route フィルターが廃止されたため、ミドルウェアを使用してこれを行うこともできます。

于 2015-03-23T20:20:54.643 に答える
0

これは、フィルターを使用する正しい方法ではありません。実際、フィルター「accountname」を定義すると、それがフィルターの名前になりますが、「accountverification」を使用しています。

あなたがすべきことは、UsersController コンストラクターで、アカウント名を確認することです。ルート プレフィックスは既知の値である必要があります。

于 2013-06-27T21:04:45.897 に答える