良好的 PHP Rest Api 库 [已关闭]
我正在开发一个跨平台系统,我需要制作一个休息API来将它们联系在一起。我在PHP方面有很长的经验,我想用它来做这个服务。
我可以100%手动开发API,但我希望有一些很棒的库可以简化我的开发。
有没有人对这样的库有任何经验?有什么可以推荐的吗?
我正在开发一个跨平台系统,我需要制作一个休息API来将它们联系在一起。我在PHP方面有很长的经验,我想用它来做这个服务。
我可以100%手动开发API,但我希望有一些很棒的库可以简化我的开发。
有没有人对这样的库有任何经验?有什么可以推荐的吗?
我得到了这个问题的徽章,所以我觉得是时候详细说明我是如何做我的REST-soluton了。Popular question
我确实为这个REST Api查看了Laravel,Sympfony2和Codeigniter。他们都有一些我喜欢的元素,有些我不喜欢。我主要关心的是如何进行身份验证,因为我有一个相当复杂的算法,我的用户可以使用应用程序的access_token登录,或者access_tokens由Google或Facebook提供。我也认为完全控制我的框架,上面提到的框架有一些我认为不必要和难以解决的元素。正因为如此,我决定制作自己的 REST 解决方案。它并不像人们想象的那么难,可以通过几种方式完成。我这样做的方式需要一些关于OOP编程的知识。
Okey,所以开始一个叫做REST的基类。这个类负责处理每个调用的所有共同点。例如身份验证,解析请求的方法路径,检查等。access_token
此类中的核心内容之一是请求的路径以及如何将其转换为方法。我这样做的灵感来自Laravel。我有一个带有=>的数组,其中键是它应该匹配的url,值是要调用的实际方法。我还在URL中包含了Lavavel解析变量的方式,如下所示:key
value
'/user/(:id)' => 'user_id',
这将匹配任何 /user/[number]。它还会检查这是什么类型的请求,因此,如果这是一个简单的 get 方法,它将尝试调用 。在调用该方法时,解析的任何内容都将用作参数(因此它实际上是在调用 )。get_user_id
(:id)
get_user_id($id)
身份验证后,将评估实际的方法调用。我不希望所有方法(如)都在REST类本身中,所以我将它们分解在扩展REST类的不同控制器中。这是通过查看所请求的 URL 来完成的。如果是,脚本将检查是否存在名为 的控制器。如果存在,请检查我们要调用的方法是否存在。如果是这样,请检查参数的数量是否与我们所拥有的参数匹配。如果一切正常,请执行该方法,如果没有,则返回错误消息。在制作这样的API时,结构和错误消息非常重要。get_user_id
/user/(:id)
userController.php
在不同的控制器中,我调用 REST 类的构造函数来解析身份验证、解析 url 等。这里棘手的部分是我不想这样做:
$controller = new MyController();
$controller->printResponse();
在每个控制器的底部。因此,我做了一个小技巧和一个名为脚本的脚本,为每个控制器类动态地执行此操作。在我包含之前,我通过简单地执行.save 控制器的路径。这在运行脚本中使用。运行脚本如下所示:run.php
run.php
$path = explode('/',__FILE__);
// Splitting the file-name, removing the extension
$name = explode('.',$path[count($path)-1]);
// Uppercasing the first letter to be nice and OOP-ish
$classToCall = ucfirst($name[0]);
// Creating a new instance
$controller = new $classToCall();
// Logging
$controller->doLog();
// Printing the final response
$controller->printResponse();
我发现这是我想要构建API的完美解决方案。我可以通过在解析方法的url的数组中提供新方法来轻松添加新方法,并且可以在分离良好的控制器中添加新方法,以实现最大的清洁度。
有些人可能认为这工作量太大,但实际上我只花了几个小时就把它启动并运行了。我也称之为高度动态,因为我可以添加新的控制器,如果它们是有效的url模式,系统就会识别它们。
一些友好的建议。
如果您决定使用与此解决方案类似的方法,这些可能是一些很好的提示。在每个控制器中,执行如下操作:
public function __construct() {
// Loading the class-name, setting it in the REST-class, so we can check if it holds the method being called
$this->className = get_class($this);
// Calling RESTs constructor
parent::__construct();
}
我们需要存储当前正在使用的类。这将是或类似的东西。UserController
在 REST 类中,我可以使用此变量来检查此控制器中是否存在被调用的实际方法。我是这样做的:
// Checking if the method exists
if (method_exists($this->className,$method_name)) {
// Check to see if we have the required number of arguments represented
$ReflectionClass = new ReflectionClass($this->className);
if ($ReflectionClass->getMethod($method_name)->getNumberOfParameters() == count($this->methodUrl['args'])) {
$this->response['response'] = call_user_func_array(array($this, $method_name), $this->methodUrl['args']);
我希望这能让你们都去。
快乐的科丁
三个月前,我也有同样的问题。我花了很多时间研究最好的PHP框架。最后,我选择了Laravel。
开箱即用,它带有RESTful路由和控制器,以及易于使用的身份验证。我在大约一天内启动并运行了一个简单的REST API。
http://laravel.com/docs/routing#the-basics
http://laravel.com/docs/controllers#restful-controllers
它还带有一个很棒的ORM,使设置资源变得超级容易
http://laravel.com/docs/database/eloquent
我使用的是3.2版本,它像一个魅力一样工作,而且很稳定。版本4仍处于测试阶段,但确实具有更多面向REST的功能(我认为一个是它使从控制器中创建资源变得更加容易)
很棒的教程在这里 http://net.tutsplus.com/tutorials/php/laravel-4-a-start-at-a-restful-api/