php实现restful api有什么框架使用方便?
高洛峰
高洛峰 2017-04-10 16:26:38
0
24
1849

php框架比较多,想实现restful api用哪个比较流行

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(24)
刘奇

我目前在用 SlimFramework 做微信的开发及编写一些 Restful API .感觉还不错。你可以了解一下.

官方地址:http://www.slimframework.com
中文文档:http://tutorial.jingwentian.com/slim/ 注:版本:2.x

巴扎黑

我是来说反例的,但凡用以下风格实现controller的,实现RESTFul都很不方便

class Controller {
    public function actionFoo() {}
    public function actionBar() {}
}

因为RESTFul是对HTTP动作(GET/POST/PUT/DELETE/...)敏感的,用这种风格的Controller的框架来实现就不可避免的会出现以下这种代码

class Controller {
    public function actionFoo() {
        if (is_get) {
            /* 一坨代码 */
        } else if (is_post) {
            /* 一坨代码 */
        } else if (is_put) {
            /* 一坨代码 */
        } else if (is_delete) {
            /* 一坨代码 */
        }
    }
}

很恶心吧,可惜的是,大部分的框架都是这种风格的Controller实现,差不多都成为标准了

当然了,Laravel也无法免俗。不过Laravel稍微把这个代码优化了一下,大概的逻辑差不多是这样

class Controller {
    public function actionFoo() {
        if (is_get) {
            return $this->getAction();
        } else if (is_post) {
            return $this->postAction();
        } else if (is_put) {
            return $this->putAction();
        } else if (is_delete) {
            return $this->deleteAction();
        }
    }

    private function getAction() {}
    private function postAction() {}
    private function putAction() {}
    private function deleteAction() {}
}

Laravel里面真正的代码当然不可能是上面这样了,但是逻辑就是这么回事,框架帮你把不同的HTTP verb调用了不同的action,把这个路子套到了classic controller里面去

// 就是这样,这是从Laravel手册里面copy的
class UserController extends BaseController {

    public function getIndex()
    {
        //
    }

    public function postProfile()
    {
        //
    }

}

的确能用,但是不足够好。因为本质上都是从classic controller的角度出发,然后对RESTFul进行迁就的设计

比如一个需求,根据http协议,对一个不支持post的url发起post,应该响应http 405 (method not allowed),这些框架应该怎么做才方便呢?

Peter_Zhu

必须提 Yii2

阿神

一提到rest,就非得支持啥put、delete这些请求,感觉很无聊,我认为post和get就能应付的了我们所有的请求了。

洪涛

因为框架使用的不是很多,所以不太好推荐哪个框架使用起来比较方便,目前自己使用的 YII 实现起来就很方便,但是无论题主最后使用哪个框架,API 都是要根据需求自己来设计实现的,建议题主读下这篇文章:

《Best Practices for Designing a Pragmatic RESTful API》

另外,@lenbo_ma 的博文也很值得一读:《HTTP API响应数据规范整理》

洪涛

楼上吐槽php写API必要有一堆条件判断的朋友,restful这个难道不判断get/post/put/delete条件语句,还有更好的办法吗?

若是说真的好,golang最好

SlimFramework,挺有趣的!赞

左手右手慢动作

推荐一款非常适合RESTful和微服务接口的框架 PHPRS@github

让你在这些场景下彻底摆脱MVC。

看个例子,这是一个可能的订单管理接口实现,只需要编写下面代码,无效额外的继承和配置:

/**
 * @path("/orders/")
 */
class Orders
{
    /** 
    * 获取所有订单
     * @route({"GET","/"})
     * @return({"body"}) 此注释表示将函数返回值作为body输出
     */
    public function getAllOrders() {
        return Sql::select('*')->from('orders')->get($this->db);//数组默认将被转换成json输出
    }
    /** 
     * 获取指定的订单信息
     * @route({"GET","/*"}) *是通配符,匹配任意/orders/的子目录
     * @param({"id", "$.path[1]"})  提取路径中的第二节作为参数$id,如/orders/123中的123
      * @return({"body"})
     */
    public function getOrderById($id) {
        return Sql::select('*')->from('orders')->where('id=?',$id)->get($this->db);
    }

    /** 
     * 创建订单
     * @route({"POST","/"}) 
     * @param({"goods_info", "$._POST.goods"})
     * @return({"body"})
     */
    public function createOrder($goods_info){
        $order_id = Sql::insertInto('orders')->values($goods_info)->exec($this->db)->lastInsertId();
        return ['order_id'=>$order_id];
    }
    /**
     * @property 依赖注入点,可通过配置指定$db的示例
     */
    public $db;
}

框架通过@注释定义路由和绑定参数,另外还有一些有用的高级特性:依赖注入、自动化接口文档、接口缓存等。

刘奇

Apigility by Zend Framework 2.

刘奇

Phalcon C扩展 简单的路由,超高的效率

小葫芦

居然没看到symfony2的 symfony2

基于symfony2的一些web service的bundle

FOSRestBundle
FOSOAuthServerBundle
JMSSerializerBundle
NelmioApiDocBundle
RequestLimitBundle
RateLimitBundle
BazingaHateoasBundle
KnpJsonSchemaBundle
LexikJWTAuthenticationBundle
ResourceBundle
SerializedResponseBundle
NelmioCorsBundle
还有silex

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan