2016-09-14 8 views
0

ルートで 'や'をどうすればいいですか?Slim 3 - ルートでor-operatorを使用する方法?

たとえば、​​および/fr/aboutは、同じオブジェクト/クラス/メソッドを指しています。だから、代わりに:

$app->get('/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

$app->get('/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

私はこれを試してみました:

$app->get('/{url:[a-zA-Z0-9\-]+}|/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

私はこのエラーを取得する:

Type: FastRoute\BadRouteException 
Message: Cannot use the same placeholder "url" twice 
File: /var/www/mysite/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php 

任意のアイデアこの問題を解決する方法を何?

または回避する解決策コードを繰り返しますか?

+0

エラーはあなたの最後のルートパターンから来ています。あなたはurlを2回参照します...同じトークンを2回使用しないでください。 – geggleto

+0

@geggletoコードを繰り返さないようにするための解決策はありますか? – laukok

+0

コードを複製しないでください。http://www.slimframework.com/docs/objects/router.html#container-resolution – danopz

答えて

1

$app->get('/{url:[a-zA-Z0-9\-]+}[/{language:[en|fr]+}]', function($request, $response, $args) { 
    // code here... 
}); 

私はURLが最初に来る意味「プレースホルダの順序を変更する」ことで、言語の代わりにfr/aboutの代わりにabout/frを使用します。

このソリューションでは、Slim's built-in optional segmentsを使用しています。「language」プレースホルダを囲む角かっこに注意してください。

ただし、オプションのセグメントはルートの最後に配置する必要があります。それ以外の場合はFastRoute\BadRouteExceptionとなります。

+0

良いアイデア!ありがとう。 – laukok

2

あなたが試しているものが機能しない理由はここにあります。

あなたのルーティング:

$app->get('/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

$app->get('/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

FastRouteは、最初に一致し、ディスパッチを検索します。 これを見ると、最初のルートは​​と/fr/about に一致します。したがって、最初に発送されます。 実際には、常に最初に常にディスパッチされます。

あなたが実際に望むのは、ルート定義を並べ替えることです。

$app->get('/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 
// ADD OTHER ROUTES HERE 

// CATCH ALL 
$app->get('/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

単に別のトークンを定義する... URLの重複の問題を解決するには。プレースホルダの順序を変更すると、あなたのために可能であるならば、あなたはこのようにそれを実装することができ

$app->get('/{url:[a-zA-Z0-9\-]+}|/{language:[fr|en]+}/{url2:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 
+0

に '/ {url:[a-zA-Z0-9 \ - ] +} |/{言語:[fr | en] +}/{url2:[a-zA-Z0-9 \ - ] +} ''私はいつも404ページを取得します。 – laukok

+0

私は本当に正規表現の専門家ではありません...:Dあなたは正確に何をしようとしていますか? – geggleto

関連する問題