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
。
如何在路线中做到'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
。