我有一个非常直截了当的问题。我正在使用Slim 3来构建RESTfull api。
为什么会这样:
$app->get('/news[/{params:.*}]', function ($request, $response, $args) {
$params = explode('/', $request->getAttribute('params'));
$response->write("news!");
return $response;
});
但不是这样:
$app->get('/news[/{params:.*}]/details', function ($request, $response, $args) {
$params = explode('/', $request->getAttribute('params'));
$response->write("news details");
return $response;
});
事实上后者不会编译。
答案 0 :(得分:6)
使用无限 Optional segments表示保留每个后续细分。
在/news
/news/foo
/news/foo/bar
/news/foo/bar/...
的定义路线中,以下路径符合条件:
/details
因此,如果您在方括号后面添加额外的固定片段/news[/{params:.*}/details]
,则无效。
当您将/details
定义为方括号内的$app->get('/news[/{params:.*}[/details]]', function ($request, $response, $args) {
$params = explode('/', $request->getAttribute('params'));
if (end($params) != 'details') {
$response->write("news!");
} else {
// $params for details;
array_pop($params);
$response->write("news details");
}
// $params is an array of all the optional segments
var_dump($params);
});
段时,它确实适用于细节,但不能与第一条路线和会打破。你仍然可以使用你的第一条路线&检查最后一个参数,或者使用可选参数:
$app->group('/news', function () {
$this->map(['GET'], '', function ($request, $response, $args) {
$response->write("news w/o params");
})->setName('news');
// Unlimited optional parameters not ending with "/details"
$this->get('/{params:[[:alnum:]\/]*[^\/details]}', function ($request, $response, $args) {
$params = explode('/', $request->getAttribute('params'));
var_dump($params);
$response->write("news!");
});
// Unlimited optional parameters ending with "/details"
$this->get('/{params:[[:alnum:]\/]*\/details}', function ($request, $response, $args) {
$params = explode('/', $request->getAttribute('params'));
array_pop($params); // fix $params
var_dump($params);
$response->write("news details");
});
});
<强>更新强>
这里的实际问题似乎是路线中的碰撞定义,例如无限的可选段总是匹配第二个定义的路线。它可以通过使用路由正则表达式&amp;来定义路由来解决。在非碰撞匹配之前将它们包含在路径组中:
{{1}}