url中的可选参数 - Slim 3

时间:2016-09-11 03:54:46

标签: php rest 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;

});

事实上后者不会编译。

1 个答案:

答案 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}}