如何在Slim中构建可选参数作为问号?

时间:2014-06-16 10:25:32

标签: php api rest slim

我已经构建了我的第一个RESTful API,并使用Slim作为我的框架。到目前为止它运作良好。

现在我已经看到了一个很棒的API设计指南,其中解释说,构建API的最佳方法是保持水平不变。我想这样做并尝试弄清楚如何构建这样的URI:

my-domain.int/groups/search?q=my_query

/ groups部分已经可以使用GET,POST,PUT,DELETE,搜索查询的工作原理如下:

my-domain.int/groups/search/my_query

这是我在PHP中用于路由的代码:

$app->get('/groups/search/:query', 'findByName');

我无法弄清楚如何使用Slim中的问号构建可选参数。我无法在谷歌上找到任何东西。

编辑: 由于搜索似乎不适合我的场景,我试图展示我想要实现的另一种方式:

我想说我想从API获得部分回复。请求看起来应该是这样的:

my-domain.int/groups?fields=name,description

不是那样的:

my-domain.int/groups/fields/name/description

如何在路由中实现这一点?

4 个答案:

答案 0 :(得分:6)

查询字符串提供的参数GET参数不必在route参数中指定。框架将尝试匹配没有这些值的URI。要访问GET参数,您可以使用标准 php方法,该方法使用超级全局$_GET

$app->get('/groups/test/', function() use ($app) {
    if (isset($_GET['fields']){
        $test = $_GET('fields');
        echo "This is a GET route with $test";
    }
});

或者你可以使用框架的方法,正如@Raphael在他的回答中提到的那样:

$app->get('/groups/test/', function() use ($app) {
    $test = $app->request()->get('fields');
    echo "This is a GET route with $test";
});

答案 1 :(得分:4)

好的,我找到了一个在http://help.slimframework.com/discussions/problems/844-instead

上做我需要的例子

如果要构建像

这样的URI样式
home.int/groups/test?fields=name,description

你需要像这样建立一个溃败

$app->get('/groups/test/', function() use ($app) {
    $test = $app->request()->get('fields');
    echo "This is a GET route with $test";
});

它呼应: 这是一个名称为描述的GET路由

即使它至少不是数组,我也可以使用问号。使用通配符我必须使用/

答案 2 :(得分:1)

您可能还有可选的路线参数。这些是使用一条路线进行博客存档的理想选择。要声明可选的路由参数,请指定您的路由模式:

<?php
$app = new Slim();
$app->get('/archive(/:year(/:month(/:day)))', function ($year = 2010, $month = 12, $day = 05) {
    echo sprintf('%s-%s-%s', $year, $month, $day);
});

每个后续路段都是可选的。此路由将接受以下的HTTP请求:

/archive
/archive/2010
/archive/2010/12
/archive/2010/12/05

如果HTTP请求中省略了可选路由段,则使用回调签名中的默认值。

答案 3 :(得分:0)

搜索查询不适用于url参数,因为搜索字符串可能包含url分隔符(在您的情况下为/)。将它作为查询参数保持没有错,你不必在任何地方推广这个概念。

但是要回答你的问题,可选参数将作为另一个网址解决:

$app->get('/groups/search/:query', 'findByName');
$app->get('/groups/search/strict/:query', 'findByNameStrict');
编辑:似乎你想使用Slim的通配符路由。你只需要确保只有一条路线的间隔。

$app->get('/groups/fields/:fields+', 'getGroupsFiltered');

参数$fields将是一个数组。