php框架比较多,想实现restful api用哪个比较流行
我是来说反例的,但凡用以下风格实现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),这些框架应该怎么做才方便呢?
因为框架使用的不是很多,所以不太好推荐哪个框架使用起来比较方便,目前自己使用的 YII
实现起来就很方便,但是无论题主最后使用哪个框架,API
都是要根据需求自己来设计实现的,建议题主读下这篇文章:
另外,@lenbo_ma 的博文也很值得一读:《HTTP API响应数据规范整理》
楼上吐槽php写API必要有一堆条件判断的朋友,restful这个难道不判断get/post/put/delete条件语句,还有更好的办法吗?
若是说真的好,golang最好
SlimFramework,挺有趣的!赞
推荐 PhpBoot, 为快速开发 RESTful API 设计的PHP框架。它可以帮助开发者更聚焦在业务本身, 而将原来开发中不得不做, 但又重复枯燥的事情丢给框架, 比如编写接口文档、参数校验和远程调用代码等。
PhpBoot 框架提供许多主流的特性, 如ORM、依赖注入等。 这些特性都经过精心设计和选择(有些是第三方开源代码,如 PHP-DI),但和其他框架相比较, PhpBoot 最显著的特色是:
你肯定看到过这样的代码:
// **不用** 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。
Swagger是目前最流行的接口文档框架。虽然很多框架都可以通过扩展支持Swagger, 但一般不是需要编写很多额外的注释, 就是只能导出基本的路由信息, 而不能导出详细的输入输出参数。而 PhpBoot 可以在不增加额外编码负担的情况下, 轻松去完成上述任务,下图为findBooks对应的文档。更多内容请见文档和在线 Demo。
使用 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();
},
]);
更多内容请查看文档
IDE 的代码提示功能可以让开发者轻松不少, 但很多框架在这方面做的并不好, 你必须看文档或者代码, 才能知道某个功能的用法。PhpBoot 在一开始就非常注重框架的 IDE 友好性, 尽可能让框架保持准确的代码提示。比如下图是 DB 库在 PhpStorm 下的使用:
可以看到, IDE 的提示是符合 SQL 语法规则的, 并不是简单罗列所有 SQL 指令。
安装 composer (已安装可忽略)
curl -s http://getcomposer.org/installer | php
安装 PhpBoot
composer require "caoym/phpboot"
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...
居然没看到symfony2的 symfony2
基于symfony2的一些web service的bundle
FOSRestBundle
FOSOAuthServerBundle
JMSSerializerBundle
NelmioApiDocBundle
RequestLimitBundle
RateLimitBundle
BazingaHateoasBundle
KnpJsonSchemaBundle
LexikJWTAuthenticationBundle
ResourceBundle
SerializedResponseBundle
NelmioCorsBundle
还有silex
推荐一个 recess 应该会对你有所启发,restful 关键不在于框架的选择,而是你如何理解、实现restful。相比于其他框架,我更喜欢 recess 使用 Annotation 来实现的Router的方式,但显然性能差了点。当然它能在 Annotation 数据跟权限的 Validation 更好了。
楼主的话有定的道理,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){}
}
4 回答13.3k 阅读✓ 已解决
5 回答7.8k 阅读✓ 已解决
1 回答1.5k 阅读✓ 已解决
1 回答969 阅读✓ 已解决
1 回答1.4k 阅读
1 回答1.5k 阅读
2 回答1k 阅读
我目前在用
SlimFramework
做微信的开发及编写一些 Restful API .感觉还不错。你可以了解一下.