2015-01-04 14 views
0

我想實現靜態文件緩存來繞過php處理。Laravel:我可以在uri後添加一些字符串而不更改其解析結果嗎?

說我們有一個uri'/api/lecturers/page/1'。我想要的是客戶端可以發送請求到'/api/lecturers/page/1.iphone6.json'。並且如果有靜態的json文件,他們可以直接得到結果。如果不是,請求被路由到'/ api/lecturers/page/1',檢索數據並將其寫入json文件。

但是,如果你請求'/api/lecturers/page/1.iphone6.json',最後一段被解析爲'1.iphone6.json',這實際上是api的一個錯誤的參數,而是比'1'。

所以問題是如何讓laravel忽略'.iphone6.json'部分的uri?或者你有什麼想法可以產生相同的效果? 在此先感謝!

更新:我想nginx的配置作爲@ateoa說

if (-f $request_filename){ 
    break; 
} 
if ($request_uri ~ "(.*?)\.(.*?)\.json"){ 
    rewrite ^(.*?)\.(.*?)\.json$ $1; 
} 
try_files $uri $uri/ /index.php?$query_string; 

當我要求

'http://xxx/api/v1/lecture/list/date/1/desc.iphone6.json' 

,它導致nginx的錯誤 「」/ wwwpath/API/V1 /講座/名單/ date/1/desc「失敗(2:沒有這樣的文件或目錄)」

現在,我不知道如何去T_T!

回答

0

爲什麼不用RESTFUL API來處理您的請求,該API會產生一個更乾淨的URL。

'/api/lecturers/page/1.iphone6.json'凌亂有點

爲什麼不使用/api/v1/lecturers/page/iphone6 - 在你的控制器它是一個很好的做法你的API中包括版本名稱

Route::group(array('prefix' => 'api/v1'), function() 
{ 
    Route::resource('lecturers/page', 'LecturersController'); 
}); 

然後

class LecturersController extends \BaseController { 

    public function show($iphone) 
    { ///api/lecturers/page/iphone 

     $json_file = "{$iphone}.json"; 
     $json_file_path = app_path("public/json/$json_file"); 
     $json_data = ''; 

     //Let me assume your static json files are stored in public/json 

     if(!File::exists($json_file_path)) { 

      $page = Page::where('iphone', $iphone)->get(); 

      //Avoid creating a file for invalid phones 
      if($page->count()){ 

       $json_data = json_encode($page->toArray()); 

       fopen($json_file_path, "w"); 

       file_put_contents($json_file_path,$json_data); 
      } 
     }elseif(File::exists($json_file_path)){ 
      $json_data = file_get_contents($json_file_path); 
     } 

     //There is Response::json() in Laravel 4 however this will do 

     return Response::make($json_data, 200); 

    } 

} 

//這可能不是你想要的最好的實現,但我相信你可以改進它

+0

謝謝你對api版本的建議thing.i'll接受它。 –

+0

我想繞過php,這樣nginx可以每秒處理更多的請求。如果我必須在php中處理邏輯,那麼做這些骯髒的工作是沒有意義的。 –

0

/api/lecturers/page/1?jsonfilename=iphone6.json /api/lecturers/page/1 $_GET['jsonfilename']

+0

感謝您的回答,但'/api/lecturers/page/1?jsonfilename=iphone6.json'不直接訪問靜態json文件。我必須在php中做一些工作,這不是我想要的。 –

+0

哦〜你在ngnix中製作邏輯。 – ateoa

+0

在nginx中,它有'if'和'try_files',你可以在nginx中添加邏輯,並將URL重寫爲靜態json文件或者api路由。 – ateoa

相關問題