0

ルートで「または」を実行するにはどうすればよいですか?

たとえば、同じオブジェクト/クラス/メソッド/about/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

この問題を解決する方法はありますか?

または、コードの繰り返しを避けるための解決策はありますか?

4

2 に答える 2

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 は最初の一致を見つけてディスパッチします。これを見ると、最初のルートは と の両方/aboutに一致するため、最初/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
});
于 2016-09-14T19:30:40.920 に答える
1

プレースホルダーの順序を変更できる場合は、次の方法で実装できます。

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

「プレースホルダーの順序を変更する」とは、URLが最初に来て、次に言語が来ることを意味するので、代わりfr/aboutabout/fr.

このソリューションは、Slim の組み込みオプション セグメントを利用します。「言語」プレースホルダーを囲む角括弧に注意してください。

ただし、オプションのセグメントをルートの最後に配置する必要がありますFastRoute\BadRouteException

于 2016-10-02T19:40:04.287 に答える