Slim 3 - 如何在路由中使用 or-operator?

Slim 3 - how to use or-operator in the route?

如何在路线中做到'or'?

例如,/about/fr/about 指向同一个 objects/classes/methods。所以代替:

$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

有什么解决这个问题的想法吗?

或者避免重复代码的任何解决方案?

这就是您尝试的方法不起作用的原因。

您的路线:

$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
});

如果您可以更改占位符的顺序,您可以通过以下方式实现它:

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

"changing the order of the placeholders" 我的意思是 url 排在第一位,然后是语言,所以您使用 about/fr.

而不是 fr/about

该解决方案利用 Slim's built-in optional segments:注意包裹 "language" 占位符的方括号。

但是,它要求将可选路段放在路线的末端,否则您会得到 FastRoute\BadRouteException