2013-03-10 143 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/