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

时间:2016-09-14 17:48:15

标签: php slim slim-3

我该怎么做'或'在路线?

例如,

/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

有什么想法如何解决这个问题?

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

2 个答案:

答案 0 :(得分: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
});

答案 1 :(得分:1)

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

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

通过“更改占位符的顺序”,我的意思是首先使用网址,然后是语言,因此使用fr/about代替about/fr

解决方案使用Slim's built-in optional segments:注意包含“language”占位符的方括号。

但是,它要求将可选段放置在路径的末尾,否则您将获得FastRoute\BadRouteException