我正在开发一个跨平台系统,我需要创建一个rest API来将它们绑定在一起。我有很长的PHP经验,我想用它来做这项服务。
我可以手动开发100%的API,但我希望有一些很棒的库可以帮助我开发。
有没有人有像这样的图书馆的经验?你能推荐什么?
答案 0 :(得分:14)
我为这个问题获得了徽章Popular question
,所以我觉得我的时间详细说明了我的REST-soluton。
我确实看过这个REST Api的Laravel,Sympfony2和Codeigniter。他们都有一些我喜欢的元素和一些我不喜欢的元素。我主要担心的是如何进行身份验证,因为我有一个相当复杂的算法,我的用户可以使用应用程序登录。由Google或Facebook提供的access_token或access_tokens。我也更完全控制我的框架,上面提到的框架有一些我认为不必要且难以解决的元素。因此,我决定制作自己的REST解决方案。它没有人们想象的那么难,而且可以通过多种方式完成。我这样做的方式需要一些关于OOP编程的知识。
Okey,所以开始创建一个名为REST的基类。这个课程负责每个电话的所有共同点。与身份验证一样,解析请求的方法路径,检查access_token
等
此类中的一个主要内容是请求的路径以及如何将其转换为方法。我的灵感来自Laravel。我有一个key
=>的数组value
其中键是应匹配的url,值是要调用的实际方法。我还包括Lavavel在URL中解析变量的方式,如下所示:
'/user/(:id)' => 'user_id',
这将匹配任何/ user / [number]。它还检查这是什么类型的请求,因此如果这是一个简单的get方法,它将尝试调用get_user_id
。在调用该方法时,使用(:id)
解析的任何内容都将被用作参数(因此它实际上正在调用get_user_id($id)
)。
验证后,将评估实际的方法调用。我不想在REST类本身中使用所有方法(如get_user_id
),因此我在扩展REST类的不同控制器中将它们分解。这是通过查看所请求的URL来完成的。如果是/user/(:id)
,脚本将检查是否存在名为userController.php
的控制器。如果存在,请检查我们要调用的方法是否存在。如果是,请检查参数的数量是否与我们的参数相匹配。如果一切正常,请执行该方法,如果没有返回错误消息。在制作这样的API时,结构和错误消息非常重要。
在不同的控制器中,我调用REST类的构造函数来获取身份验证,解析url等解析。这里棘手的部分是我不想这样做:
$controller = new MyController();
$controller->printResponse();
在每个控制器的底部。所以我做了一个小hack和一个名为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的完美解决方案。我可以通过在解析urls方法的数组中提供新方法来轻松添加新方法,并且我可以在分离良好的控制器中添加新方法以获得最大的清洁度。
有些人可能认为这是太多的工作,但实际上我花了几个小时来启动和运行。我也称之为高度动态,因为我可以添加新的控制器,如果它们是有效的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']);
我希望能让你们全力以赴。
快乐的密码'
答案 1 :(得分:1)
三个月前我有同样的问题。我花了很多时间研究最好的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/