PHP:可选和必需参数的细长组合

时间:2017-07-18 05:30:03

标签: php slim-3

我想要以下类型的路线。

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

在路线中我想要跟随:

  • 类别 - 强制性
  • SubCategory - 可选
  • 页面 - 强制性

我可以在一条路线上完成吗?如果是这样,怎么能实现呢?我想为这些路径提供一个函数:

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

2 个答案:

答案 0 :(得分:0)

在可选后,您不能拥有强制占位符。如果你尝试,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结构仍然非常干净。

答案 1 :(得分:0)

您可以使用相同的回调创建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);