2014-02-14 41 views
0

我剛剛開始修改Laravel(PHP newbie alert),我對如何在此框架上實現REST JSON API存在疑問。Laravel和具有多個「嵌套」任務和參數的路由

所需的URL路徑應該是:

http://api.mysite.com/APIKEY/FUNCTION/(ARGUMENTS)* 

但什麼是做到這一點的最好方法是什麼?

我沒有找到足夠的解釋性指南,因爲它假定每個功能(身份驗證,搜索等)在不同的路線上。

在我設法創建所需要的數據遷移和模型,我還設置了路線這樣的時刻:

Route::get('/{apikey}/{function}/{arg1}/{arg2}/{arg3?}', 
//The first two arguments are mandatory, the 3rd optional 
function($apikey,$function,$arg1,$arg2) 
{ 
     return Response::json(array(
     'status'=>'200'), 
     200); 
}) 
->where(array('function'=>'[A-Za-z]+')); 

這應該是正確的操作流程,但我有一些懷疑。

  1. 檢查apikey是否有效,如果沒有返回404 json響應。我如何調用這樣的函數,我在哪裏定義它?
  2. 如果密鑰檢查是成功的,那麼瞭解哪個函數是需要的(我應該使用switch結構還是有更好的方法來實現這一點,比如路由組?在所有使用Route::group的例子中都有一個靜態前綴,前綴是apikey,變量)
  3. 返回數據 - 如果可用 - 從數據庫中獲取數據。我想對於每個函數,我應該編寫一個特定的控制器,使用Models從數據庫獲取數據。

回答

1

@ 1。我想我可能會使用一個路由過濾器對於這一點,就像這樣:

Route::filter('apikey', function(){ 
    if (Shared\API::checkIfKeyIsValid(Input::get('key') != true){ 
     return Shared\Errors::handleError("bad-api-key"); 
    } 
}); 

你可以看到這個過濾器檢查,以確保一些會話變量被設置和匹配,如果返回任何東西,這是失敗的,並它不會發送路由通常所在的用戶。你可以這樣稱呼它:

Route::get('play/{id}', array('before' => 'loggedin', 'uses' => '[email protected]')); 

@ 2。我認爲一個路線組是我如何構建這個(如果我明白你在問什麼)。
編輯:你已經改變了這個問題,因爲我回答了,關於前綴是一個變量。我會重新排序參數,以便API密鑰是在年底,或者你可以看看這個,這可能會做你想要什麼:https://github.com/jasonlewis/enhanced-router

Route::group(array('prefix' => 'api'), function() 
{ 
    //the routes for all API calls 
    Route::group(array('prefix' => '/v1'), function() 
    { 
     //for version 1 
     Route::group(array('prefix' => '/thing', 'before' => 'loggedin'), function() 
     { 
      //for things only 
      Route::get('/getThing/{id}', '[email protected]'); 
      Route::get('/getDifferentThing/{id}/{aux}/{optional?}', '[email protected]'); 
     }); 
    }); 
}); 

@ 3。數據的返回應該通過你的控制器完成,數據來自模型。要麼將它作爲視圖返回,要麼將它作爲JSON返回,如下所示:

return Response::json($data); 
+0

1-您如何處理身份驗證?調用返回true或false的Controller函數?一點都不清楚。對於身份驗證,我只想發送api密鑰並對其進行一些檢查。在創建驗證過濾器之前,我應該定義驗證(密鑰檢查)功能,但我不知道如何:) 2-好吧 3好吧 – Vektor88

+0

@ Vektor88我已經更新了#1,希望能更好地解釋它。我有我的類在一個共享文件夾結構,然後這個例子假設我有一個名爲「API」的類。我調用一個名爲「checkIfKeyIsValid」的函數,如果該鍵有效,則返回「true」;如果不是,則返回「false」。過濾器檢查該函數返回的內容,如果它不返回「true」,則會拋出(自定義)錯誤,並且由於它表示「返回」,過濾器失敗,路由處理停止。 – snollygolly

+0

感謝您的編輯,我開始瞭解我應該做什麼以及面向對象的PHP如何工作。但是從第一點開始,點2需要可變的前綴,我沒有改變任何東西! – Vektor88