2016-09-11 20 views
0

私はかなり簡単な質問があります。私はSlim 3を使ってRESTfull APIを構築しています。後者はコンパイルされません実際にはURLのオプションパラメータ - Slim 3

$app->get('/news[/{params:.*}]/details', function ($request, $response, $args) { 
$params = explode('/', $request->getAttribute('params')); 
     $response->write("news details"); 
     return $response; 

}); 

$app->get('/news[/{params:.*}]', function ($request, $response, $args) { 
    $params = explode('/', $request->getAttribute('params')); 
    $response->write("news!"); 
    return $response; 

}); 

ではなく、この:どうしてこの作品

+0

:それは前に非衝突マッチにルートグループで囲むルート正規表現 &とルートを定義することによって解決することができますか? – Baumi

答えて

3

無制限Optional segmentsを使用することは、それぞれの結果のセグメントが予約されていることを意味します。次のパスは、資格/news[/{params:.*}]のためのあなたの定義されたルートで

/news 
/news/foo 
/news/foo/bar 
/news/foo/bar/... 

だからあなたは角括弧の後にそれを追加した場合、余分な固定セグメント/detailsが動作しません加えます。

角括弧内の/detailsセグメントを使用して/news[/{params:.*}/details]と定義すると、詳細は機能しますが、最初のルートとの組み合わせでは機能しません。&が壊れます。どこ、ここでの実際の問題は、ルートでの衝突の定義のように思える

:更新

$app->get('/news[/{params:.*}[/details]]', function ($request, $response, $args) { 

    $params = explode('/', $request->getAttribute('params')); 

    if (end($params) != 'details') { 

     $response->write("news!"); 

    } else { 

     // $params for details; 
     array_pop($params); 

     $response->write("news details"); 
    } 

    // $params is an array of all the optional segments 
    var_dump($params); 

}); 

を:あなたはまだ以内にあなたの最初のルート&最後のparamをチェック、またはオプションのparamと一緒に行くことができますたとえば、無制限のオプションのセグメントは、常に2番目に定義されたルートと一致します。あなたがルートしたいパスの例を追加でき

$app->group('/news', function() { 

    $this->map(['GET'], '', function ($request, $response, $args) { 

     $response->write("news w/o params"); 

    })->setName('news'); 

    // Unlimited optional parameters not ending with "/details" 
    $this->get('/{params:[[:alnum:]\/]*[^\/details]}', function ($request, $response, $args) { 
     $params = explode('/', $request->getAttribute('params')); 

     var_dump($params); 

     $response->write("news!"); 
    }); 

    // Unlimited optional parameters ending with "/details" 
    $this->get('/{params:[[:alnum:]\/]*\/details}', function ($request, $response, $args) { 
     $params = explode('/', $request->getAttribute('params')); 
     array_pop($params); // fix $params 

     var_dump($params); 

     $response->write("news details"); 
    }); 

}); 
+1

私は/news//{params:.*}]/detailsと/news[/{params:.*}との区別が必要です。私はいつも/news/details[/{params:.*}として書くことができますが、それはもはや自明ではありません... –

+0

私は答えを更新しましたが、実際にあなたの最初のルートは、最後のセグメントは "/ details"として最初のルートにも一致します。 –

+0

これを試しましたか? –

関連する問題