url 中的可选参数 - Slim 3
Optional parameters in url - Slim 3
我有一个非常简单的问题。我正在使用 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;
});
实际上后者不编译
使用unlimited Optional segments,意味着每个后续段都被保留。
在您为 /news[/{params:.*}]
定义的路由中,以下路径符合条件:
/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");
});
});
我有一个非常简单的问题。我正在使用 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;
});
实际上后者不编译
使用unlimited Optional segments,意味着每个后续段都被保留。
在您为 /news[/{params:.*}]
定义的路由中,以下路径符合条件:
/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");
});
});