2013-03-10 76 views
11

我正在开发一个跨平台的系统,我需要制作一个休息API以将它们连接在一起。我在PHP方面有很长的经验,我想用这个来实现这个服务。良好的PHP Rest Api库

我可以手动开发一个API 100%,但我希望有一些伟大的图书馆可以缓解我的发展。

有没有人有像这样的图书馆的经验?任何你可以推荐的东西?

+1

这里是一个很好的文章:REST的API与Symfony2的:正确的方式(http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2 - 正确的方式/) – j0k 2013-03-10 21:24:13

+0

@ j0k:酷,我会看看它。也许解决方案可能很简单。谢谢。 – OptimusCrime 2013-03-10 21:27:48

+0

你是怎么相处的? – 2013-03-18 18:36:17

回答

11

我得到的徽章Popular question对于这个问题,所以我觉得是时候详细阐述我是如何完成我的REST解决方案的。

我确实看过Laravel,Sympfony2和Codeigniter这个REST Api。他们都有我喜欢的一些元素,有些我不喜欢。我主要关心的是如何进行身份验证,因为我的算法相当复杂,我的用户可以使用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(); 

在每个控制器的底部。所以我做了一些小技巧和一个名为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']); 

我希望能让你一切顺利。

快乐打号

+0

你可以上传你的代码到GitHub吗?因为我在PHP中的知识是有限的,我的应用程序也有用户。 – 2018-03-07 13:09:22

+0

@SouravBagchi我的答案应该已经更新。现在已经非常陈旧了。我会建议看Slim并将其用作微服务。我的回答并不意味着对PHP编程语言的介绍。 – OptimusCrime 2018-03-07 13:20:30

+0

感谢您的快速回复。 Slim框架可以处理用户管理吗?我面临的主要问题是用户管理。 Google和Facebook集成的登录过程以及我的MySQL数据库中都有一些数据,只有用户才能登录。 – 2018-03-07 13:31:39

0

三个月前我有同样的问题。我花了很多时间研究最好的PHP框架使用。最后,我解决了Laravel

开箱即用的是REST风格的路由和控制器,易于使用的认证。我做了一个简单的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版仍处于测试阶段,但确实有很多更多的休息导向功能(我认为一个是,它可以更容易地从你的控制器内创造资源)

大这里的教程http://net.tutsplus.com/tutorials/php/laravel-4-a-start-at-a-restful-api/