2015-03-25 55 views
3

我發現了有關處理嵌套資源控制器和傳遞多個約束的好信息,但似乎沒有在這個特定問題上找到任何東西(可能是因爲我正在考慮它一切都錯了!)。在創建REST API時使用Laravel嵌套動態資源控制器的正確方式

如果我要創建我的API以下

  • /汽車(顯示所有汽車)
  • /汽車/ 1(顯示carId = 1)
  • /汽車/ 1 /性能(顯示carId = 1的性能)
  • /cars/1/performance/parts(顯示carId = 1的部件性能)
  • /cars/1/performance/parts/1(顯示carId的partId = 1的性能= 1)
  • /汽車/性能(顯示所有的汽車的性能)
  • /汽車/性能/份
  • /份
  • /部件/ 1等...(對於相同的部件與上述汽車)

我會以這種方式

Route::group(array('prefix' => 'myAwesomeCarApi'), function() 
{ 
    Route::resource('cars', 'CarsController'); 
    Route::resource('cars/performance', 'CarsPerController'); 
    Route::resource('cars/performance/parts', 'CarsPerPartsController'); 
    Route::resource('cars.performance/parts', 'CarsPerPartsController'); 
    Route::resource('parts', 'PartsController'); 
    Route::resource('parts/performance', 'PartsPerController'); 
    etc... 
}); 

創造大部分路線和控制器或者是有一些掛羊頭賣狗肉,我失蹤了創建動態控制器,例如只有3個(CarController,PartsController,PerformanceController)和HA在代碼中查找不同的路線?

回答

3

我認爲你要找的是嵌套的資源控制器。這些允許您建立像/car/1/part/1這樣的路線。該路線將映射到動作[email protected]並傳遞兩個參數:汽車ID和零件ID。

在的汽車/零部件性能方面,我會說這是有點像「秀」的方法(在性能不是一個實體本身),所以會造成這樣在控制器的另一種方法:

class CarPartController extends Controller { 

    public function show($carId, $partId) 
    { 
     // Show specified part for specified car 
    } 

    public function performance($carId, $partId) 
    { 
     // Show the performance for specified part on specified car 
    } 

} 

然後你的路線是這樣的:

Route::get('car/{car}/performance', '[email protected]'); 
Route::get('car/{car}/part/{part}/performance', '[email protected]'); 

Route::resource('car', 'CarController'); 
Route::resource('car/{car}/part', 'CarPartController'); 

按照Laravel文檔,非資源方法具有資源控制器之前定義。

你也可以採取這種做法更進一步,實現路由模型結合,讓您的CarPart模型的實例被注入到你的控制器行動,而不是標識:

Route::model('car', 'Car'); 
Route::model('part', 'Part'); 

和示例控制器行動:

public function performance(Car $car, Part $part) 
{ 
    // Show performance for specified part on specified car 
} 

希望這會有所幫助。

+0

非常感謝,這是我所需要的。當你第一次開始使用路由,mvc和REST API時,有很多概念讓你頭腦發熱,所以應用它們有時候會讓人困惑! – 2015-03-25 14:11:31

+0

我想我的後續問題是如何或是否符合REST原則,因爲一旦我開始使用 Route :: get('car/{car}/performance','CarController @ performance'); am然後,我沒有離開嚴格的GET/PUT/DELETE等REST原則 – 2015-03-25 16:03:51

+0

我的理解你的應用程序的方式,「性能」端點只是整理統計數據並將其返回,而不是將它們本身作爲一個實體更新,刪除等。這是正確的嗎? – 2015-03-25 20:55:29