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

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

阅读 81.6k
24 个回答

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

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

若是说真的好,golang最好

SlimFramework,挺有趣的!赞

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

推荐 PhpBoot, 为快速开发 RESTful API 设计的PHP框架。它可以帮助开发者更聚焦在业务本身, 而将原来开发中不得不做, 但又重复枯燥的事情丢给框架, 比如编写接口文档、参数校验和远程调用代码等。

特色

PhpBoot 框架提供许多主流的特性, 如ORM、依赖注入等。 这些特性都经过精心设计和选择(有些是第三方开源代码,如 PHP-DI),但和其他框架相比较, PhpBoot 最显著的特色是:

1. 以面向对象的方式编写接口

你肯定看到过这样的代码:

// **不用** PhpBoot 的代码
class BookController
{
    public function findBooks(Request $request)
    {
        $name = $request->get('name');
        $offset = $request->get('offset', 0);
        $limit = $request->get('limit', 10);
        ...
        return new Response(['total'=>$total, 'data'=>$books]);
    }
    
    public function createBook(Request $request)
    ...
}

很多主流框架都需要用类似代码编写接口。但这种代码的一个问题是, 方法的输入输出隐藏在实现里, 这不是通常我们提倡的编码方式。如果你对代码要求更高, 你可能还会实现一层 Service 接口, 而在 Controller 里只是简单的去调用 Service 接口。而使用 PhpBoot, 你可以用更自然的方式去定义和实现接口。上面的例子, 在 PhpBoot 框架中实现是这样的:

/**
 * @path /books/
 */
class Books
{
    /**
     * @route GET /
     * @return Book[]
     */
    public function findBooks($name, &$total=null, $offset=0, $limit=10)
    {
        $total = ...
        ...
        return $books;
    }
  
    /**
     * @route POST /
     * @param Book $book {@bind request.request} bind $book with http body
     * @return string id of created book
     */
    public function createBook(Book $book)
    {
        $id = ... 
        return $id;
    }
}

上面两份代码执行的效果是一样的。可以看到 PhpBoot 编写的代码更符合面向对象编程的原则, 以上代码完整版本请见phpboot-example

2. 轻松支持 Swagger

Swagger是目前最流行的接口文档框架。虽然很多框架都可以通过扩展支持Swagger, 但一般不是需要编写很多额外的注释, 就是只能导出基本的路由信息, 而不能导出详细的输入输出参数。而 PhpBoot 可以在不增加额外编码负担的情况下, 轻松去完成上述任务,下图为findBooks对应的文档。更多内容请见文档在线 Demo

3. 简单易用的分布式支持

使用 PhpBoot 可以很简单的构建分布式应用。通过如下代码, 即可轻松远程访问上面示例中的 Books 接口:

$books = $app->make(RpcProxy::class, [
        'interface'=>Books::class, 
        'prefix'=>'http://x.x.x.x/'
    ]);
    
$books->findBooks(...);

同时还可以方便的发起并发请求, 如:

$res = MultiRpc::run([
    function()use($service1){
        return $service1->doSomething();
    },
    function()use($service2){
        return $service2->doSomething();
    },
]);

更多内容请查看文档

4. IDE 友好

IDE 的代码提示功能可以让开发者轻松不少, 但很多框架在这方面做的并不好, 你必须看文档或者代码, 才能知道某个功能的用法。PhpBoot 在一开始就非常注重框架的 IDE 友好性, 尽可能让框架保持准确的代码提示。比如下图是 DB 库在 PhpStorm 下的使用:

可以看到, IDE 的提示是符合 SQL 语法规则的, 并不是简单罗列所有 SQL 指令。

主要特性

安装和配置

  1. 安装 composer (已安装可忽略)

    curl -s http://getcomposer.org/installer | php
  2. 安装 PhpBoot

    composer require "caoym/phpboot"
  3. index.php 加载 PhpBoot

    <?php
    require __DIR__.'/vendor/autoload.php';
          
    $app = \PhpBoot\Application::createByDefault(__DIR__.'/config/config.php');
    $app->loadRoutesFromPath(__DIR__.'/App/Controllers');
    $app->dispatch();

帮助和文档

自荐一下我写的 Blink Framework

Blink 重分借鉴了 Yii 和 Laravel 的优点,定位优雅简洁,专注于 API 的开发,高扩展性,默认提供了常见诸如路由、登陆认证、依赖注入、日志处理、插件机制等功能,更多组件也在不断扩充中。

同时,Blink 兼容 Swoole,FPM,CLI(php -S) 多种运行环境,对于性能要求高的场景,可以无缝接入 Swoole,获得可观的性能提升。

GitHub: https://github.com/bixuehujin...
文档:https://docs.rethinkphp.com/b...

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

推荐一个 recess 应该会对你有所启发,restful 关键不在于框架的选择,而是你如何理解、实现restful。相比于其他框架,我更喜欢 recess 使用 Annotation 来实现的Router的方式,但显然性能差了点。当然它能在 Annotation 数据跟权限的 Validation 更好了。

ToroPHP 居然没人推荐这个 专门为restful api设计的啊。

楼主的话有定的道理,laravel号称巨匠级,那是自称。用了symfony再看lavravel,其实很糙……包括orm,实在是很弱啊……内部写法太不OO了。
个人认为,laravel就是个阉割了的速成版symfony2。不知大家怎么看?

其实 Laravel 做 RESTful 是很适合的。Laravel 4 中可以用 Route::resource 直接设置 RESTful 路由,而 Laravel 5 中引入了路由注释的功能,只需要在 Controller 指定@Resource("...")即可,而且每一个 Action 通过注释都可以反向生成路由。Laravel 生成 Controller 只需要一条命令就可以搞定:

php artisan make:controller UserController

Laravel是有Resource Controller的

相关文档
http://www.golaravel.com/docs/4.1/controllers/#resource-controllers

这是通过generator自动创建的controller的代码
请参考一下注释中HTTP verb 和 url的匹配

class CommentsController extends \BaseController {

/**
 * Display a listing of comments
 *
 * get comments
 *
 * @return Response
 */
public function index() {}

/**
 * Show the form for creating a new comment
 *
 * get comments/create
 *
 * @return Response
 */
public function create(){}

/**
 * Store a newly created comment in storage.
 *
 * post comments
 *
 * @return Response
 */
public function store() {}

/**
 * Display the specified comment.
 *
 * get comments/(:id)
 *
 * @param  int  $id
 * @return Response
 */
public function show($id){}

/**
 * Show the form for editing the specified comment.
 *
 * get comments/(:id)/edit
 *
 * @param  int  $id
 * @return Response
 */
public function edit($id){}

/**
 * Update the specified resource in storage.
 *
 * put comments/(:id)
 *
 * @param  int  $id
 * @return Response
 */
public function update($id){}

/**
 * Remove the specified resource from storage.
 *
 * delete comments/(:id);
 *
 * @param  int  $id
 * @return Response
 */
public function destroy($id){}

}

ZendFrame Work

laravel +1

laravel ++++++++1

推荐问题
宣传栏