search

Home  >  Q&A  >  body text

php实现restful api有什么框架使用方便?

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

高洛峰高洛峰2803 days ago1822

reply all(24)I'll reply

  • 怪我咯

    怪我咯2017-04-10 16:28:38

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

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

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 16:28:38

    我是来说反例的,但凡用以下风格实现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),这些框架应该怎么做才方便呢?

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 16:28:38

    必须提 Yii2

    reply
    0
  • 阿神

    阿神2017-04-10 16:28:38

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

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 16:28:38

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

    《Best Practices for Designing a Pragmatic RESTful API》

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

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 16:28:38

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

    若是说真的好,golang最好

    SlimFramework,挺有趣的!赞

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 16:28:38

    推荐一款非常适合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;
    }

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

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 16:28:38

    Apigility by Zend Framework 2.

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 16:28:38

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

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 16:28:38

    居然没看到symfony2的 symfony2

    基于symfony2的一些web service的bundle

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

    reply
    0
  • Cancelreply