PHP :可选和必需参数的精简组合

PHP : Slim Combination of Optional and Required Param

我想要以下类型的路线。

$app->get('/FetchImages/{catid}[/{subcatid}]/{page}', function ($request, $response, $args) {
    //Code
});

在我想要的路线中:

我可以在一条路线上完成吗?如果可以,如何实现?我想为这些路径设置一个函数:

{catid}/{page}
{catid}/{subcatid}/{page}

可选后不能有强制占位符。如果你尝试,fastRoute(路由器,被 Slim 使用)会给你一个错误。

即使我们从 Slim 和 fastRoute 中抽象出来,我也建议您重新考虑 API 的 URL 结构。 自然是强制在前,可选在后。

为了能够对路由使用相同的回调,我建议您传递 page 作为查询参数:

$this->get('/FetchImages/{categoryId}[/{subcategoryId}]', function($request, $response, $args) {

    $categoryId = $args['categoryId'];
    $subcategoryId = $args['subcategoryId'];

    //  Get requested page value.
    //  It defaults to null if no page specified
    $page = $request->getQueryParam('page', null);

});

并像这样发送请求:

GET http://myapp.com/FetchImages/kittens/dangerous?page=2

在这种情况下,您可以自由地跳过或跳过页面,并且URL结构仍然很干净。

您可以像这样使用相同的回调创建 2 个路由。这不是一个完美的解决方案,但您不必将页面放在查询参数中。

$myCallback = function($request, $response, $args) {
    $catid    = $args['catid'];
    $subcatid = isset($args['subcatid']) ? $args['subcatid'] : null;
    $page     = $args['page'];
    // do other stuff
};

$app->get('/FetchImages/{catid}/{page}', $myCallback);
$app->get('/FetchImages/{catid}/{subcatid}/{page}', $myCallback);