是否有相应的RESTful PHP函数的标准?

时间:2014-01-08 16:32:02

标签: php api rest standards coding-style

在一个宁静的水果API中,请求假定如下:

api/fruit
api/fruit?limit=100
api/fruit/1
api/fruit?color=red

我认为必须有一个执行工作的功能标准。例如,某些内容可能很容易转换为fruit.class.php

fruit.class.php

function get ($id, $params, $limit) {
    // query, etc.
}

因此,对于上面的示例,代码看起来像

  • api/fruit

    $fruit = $oFruit->get();
    
  • api/fruit?limit=100

    $fruit = $oFruit->get(NULL, NULL, 100);
    
  • api/fruit/1

    $fruit = $oFruit->get(1);
    
  • api/fruit?color=red

    $fruit = $oFruit->get(NULL, array('color' => 'red'));
    

这样的行业标准还是API /数据库功能总是一团糟?我真的很想标准化我的功能。

4 个答案:

答案 0 :(得分:2)

<强>前奏

对于网址的外观,并没有真正的标准或惯例,涵盖(几乎)所有情况。

我能想到的唯一标准是HATEOAS(超媒体作为应用程序状态的引擎),它基本上表明客户端应该从以前的请求中获取它可以使用的URL。这意味着网址的内容并不重要(但客户端如何发现它们)。

REST现在是一种炒作,而且往往不了解它究竟是什么。我建议您在Architectural Styles and the Design of Network-based Software Architectures上阅读Roy Fielding的论文,尤其是chapter 5

Richardson Maturity Model也是一本很好的读物。

PS:HAL(超文本应用语言)是实施HATEOAS的标准(以及其他)。

<强>接口

由于网址上没有标准,因此该主题的接口也没有标准。这在很大程度上取决于您的要求,您的品味,以及您正在构建应用程序的框架。

David Sadowski已经制作了a nice list个可以帮助您开发RESTfull应用程序的库和框架。我建议你看看其中的几个,看看他们是否以及如何解决你遇到的问题。你应该能够从他们那里得到一些想法。

另请阅读我在前奏中提到的参考资料,因为它将为您提供有关构建真实RESTfull应用程序的注意事项和非注意事项的良好见解。

PS:很抱歉没有给你一个直截了当的明确答案! (我认为不存在。)

答案 1 :(得分:2)

您正在谈论获取过滤器。我更喜欢magento like filters 没有关于你的内部代码应该如何看的惯例,也没有那么多的php框架支持诸如get过滤器之类的功能。你可以看一下magento rest api的实现。

您可以使用函数调用,例如$ model-&gt; get($ where,$ order,$ limit) 但你应该

  • 定义资源属性

  • 将资源属性映射到数据库结果字段

  • 定义哪些过滤器资源支持

  • 检查过滤器,删除不受支持的内容并构建相应的$ where,$ order,$ limit

答案 2 :(得分:2)

不,没有标准,因为其他人已经回答了......但是,在回答你关于创建太多方法的问题时...我通常只有一个search()方法,它返回一个或多个结果基于我的搜索条件。我通常会创建一个“搜索对象”,其中包含我的OOP方式的条件,然后可以通过数据层进行解析...但这可能比您想要进入的更多...很多人会为他们构建他们的DQL数据层等等。有很多方法可以避免getById,getByColor,getByTexture,getByColorAndTexture。如果你开始看到很多方法来涵盖每一种可能的搜索组合,那么你可能做错了。

关于休息方法的命名...... ZF2不是答案,但它是我目前在工作中使用的那个,它的方法是这样布局的(请注意,这是可怕的,危险的代码...打开SQL注入......只是这样做):

// for GET URL: /api/fruit?color=red
public function getList() {
    $where = array();
    if( isset($_GET['color']) ) {
        $where[] = "color='{$_GET['color']}'";
    }
    if( isset($_GET['texture']) ) {
        $where[] = "texture='{$_GET['texture']}'";
    }
    return search( implode(' AND ',$where) );
}
// for GET URL: /api/fruit/3
public function get( $id ) {
    return getById( $id );
}
// for POST URL /api/fruit
public function create( $postArray ) {
    $fruit = new Fruit();
    $fruit->color = $postArray['color'];
    save($fruit);
}
// for PUT URL /api/fruit/3
public function update( $id, $putArray ) {
    $fruit = getById($id);
    $fruit->color = $putArray['color'];
    save($fruit);
}
// for DELETE /api/fruit/3
public function delete( $id ) {
    $fruit = getById($id);
    delete($fruit);

}

答案 3 :(得分:0)

开源库phprs可能符合您的需求。

使用phprs,您可以像这样实现fruit.class:

/**
 * @path("/api/fruit")
 */
class Fruit{
    /**
     * @route({"GET","/"})
     * @param({"color","$._GET.color"})
     * @param({"limit","$._GET.limit"})
     */
    function getFruits($color,$limit){
        return $oFruit->get(NULL, array('color' =>$color),$limit);
    }
    /**
     * @route({"GET","/*"})
     * @param({"id","$.path[2]"})
     */
    function getFruitById($id){
       return $oFruit->get($id);
    }
}