2017-07-18 13 views
1

ルートの種類を希望します。ルートでPHP:オプションと必須パラメータのスリムな組み合わせ

$app->get('/FetchImages/{catid}[/{subcatid}]/{page}', function ($request, $response, $args) { 
    //Code 
}); 

私は、次の欲しい:

  • カテゴリー - 必須
  • サブカテゴリ - オプション
  • ページ - 必須

は、私は1つのルートでそれを行うことができますか?もしそうなら、どのように達成することができますか?私はこれらのパスのための1つの機能を持っています:

{catid}/{page} 
{catid}/{subcatid}/{page} 

答えて

0

オプションの後に必須プレースホルダを持つことはできません。試してみると、fastRoute(ルータ、Slimによって利用されます)がエラーを表示します。

SlimとfastRouteから抽象化しても、APIのURL構造を再考することをおすすめします。 義務が最初に来るのは当然ですが、オプションは後で来ます。

はルートに同じコールバックを使用できるようにするには、私はあなたのクエリパラメータとしてpageを渡し勧め:

$this->get('/FetchImages/{categoryId}[/{subcategoryId}]', function($request, $response, $args) { 

    $categoryId = $args['categoryId']; 
    $subcategoryId = $args['subcategoryId']; 

    // Get requested page value. 
    // It defaults to null if no page specified 
    $page = $request->getQueryParam('page', null); 

}); 

そして、このようにリクエストを送信します。この場合、あなたは

GET http://myapp.com/FetchImages/kittens/dangerous?page=2

URLの構造はまだきれいです。

+0

これは別の解決策ですが、現在は動作しています。 –

0

このように同じコールバックで2つのルートを作成できます。これは完璧な解決策ではありませんが、クエリパラメータの中にページを置く必要はありません。

$myCallback = function($request, $response, $args) { 
    $catid = $args['catid']; 
    $subcatid = isset($args['subcatid']) ? $args['subcatid'] : null; 
    $page  = $args['page']; 
    // do other stuff 
}; 

$app->get('/FetchImages/{catid}/{page}', $myCallback); 
$app->get('/FetchImages/{catid}/{subcatid}/{page}', $myCallback); 
+0

それはより良い解決策ですか?私はクエリのparamを送信することは安全で問題はないと思うので。しかし、私はこの作業を行う適切な方法を知りたい。 –

+0

私は両方が良いと言うでしょう。しかし、彼らは異なる結果を持っています。 'page'をパスパラメータとして使用する場合はこのバージョンを選択し、queryパラメータとしてpageを使用する場合はもう一方を選択することができます。 – jmattheis

関連する問題