我该怎么做'或'在路线?
例如, /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
有什么想法如何解决这个问题?
或任何避免重复代码的解决方案?
答案 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
。