占位符
上述的每个路由方法都接受一个 URL 模式,与当前的 HTTP 请求 URI 进行匹配。路由模式可以使用命名的占位符来动态匹配 HTTP 请求 URI 的片段。
格式
路由模式的占位符以 { 开始,后跟着占位符名称,并以 } 结束。下面是一个名为 name 的示例占位符:
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
// ...
$app->get('/hello/{name}', function (ServerRequestInterface $request, ResponseInterface $response, array $args) {
$name = $args['name'];
$response->getBody()->write("Hello, $name");
return $response;
});
可选片段
要使一个片段可选,只需将其放在方括号中:
$app->get('/users[/{id}]', function ($request, $response, array $args) {
// 响应 `/users` 和 `/users/123`
// 但不会响应 `/users/`
return $response;
});
多个可选参数可以嵌套使用:
$app->get('/news[/{year}[/{month}]]', function ($request, $response, array $args) {
// 响应 `/news`、`/news/2016` 和 `/news/2016/03`
// ...
return $response;
});
对于“无限”可选参数,你可以这样做:
$app->get('/news[/{params:.*}]', function ($request, $response, array $args) {
// $params 是所有可选片段的数组
$params = explode('/', $args['params']);
// ...
return $response;
});
在这个例子中,URI /news/2016/03/20 将得到 $params 数组包含三个元素:['2016', '03', '20']。
正则表达式匹配
默认情况下,占位符写在 {} 内,并且可以接受任何值。然而,占位符也可以要求 HTTP 请求 URI 匹配特定的正则表达式。如果当前的 HTTP 请求 URI 不匹配占位符的正则表达式,则不会调用该路由。下面是一个名为 id 的示例占位符,它要求一个或多个数字:
$app->get('/users/{id:[0-9]+}', function ($request, $response, array $args) {
// 根据 $args['id'] 查找用户
// ...
return $response;
});