在创建REST API时,使用Laravel嵌套动态资源控制器的正确方法

Nic*_*ick 4 rest routes controllers laravel

我已经找到了关于处理嵌套资源控制器和传递多个约束的好信息,但似乎没有发现这个特定问题(可能是因为我认为这一切都错了!).

如果我想在我的API中创建以下内容

  • / cars(显示所有车辆)
  • / cars/1(显示carId = 1)
  • / cars/1/performance(显示carId = 1的性能)
  • / cars/1/performance/parts(显示carId = 1的部件性能)
  • / cars/1/performance/parts/1(对于carId = 1,显示partId = 1的性能)
  • /汽车/性能(显示所有汽车的性能)
  • /汽车/性能/件
  • /部分
  • / parts/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...
});
Run Code Online (Sandbox Code Playgroud)

或者是否有一些技巧我缺少创建动态控制器,例如只有3(CarController,PartsController,PerformanceController)和处理代码中的不同路由?

Mar*_*ean 5

我认为您正在寻找的是嵌套资源控制器.这些允许您构建/ car/1/part/1之类的路由.此路线将映射到操作CarPartController@show并传递两个参数:车辆ID和零件ID.

在汽车/零件的性能方面,我会说这有点像"show"方法(因为性能本身不是一个实体)所以会在你的控制器中创建另一个方法,如下所示:

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
    }

}
Run Code Online (Sandbox Code Playgroud)

然后你的路线看起来像这样:

Route::get('car/{car}/performance', 'CarController@performance');
Route::get('car/{car}/part/{part}/performance', 'CarPartController@performance');

Route::resource('car', 'CarController');
Route::resource('car/{car}/part', 'CarPartController');
Run Code Online (Sandbox Code Playgroud)

根据Laravel文档,必须在资源控制器之前定义非资源方法.

您还可以进一步采用此方法并实现路由模型绑定,以便将您CarPart模型的实例注入控制器操作而不是ID:

Route::model('car', 'Car');
Route::model('part', 'Part');
Run Code Online (Sandbox Code Playgroud)

以及一个控制器动作示例:

public function performance(Car $car, Part $part)
{
    // Show performance for specified part on specified car
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 您不需要添加包含通配符的段,您可以这样写:`Route :: resource('car.part','CarPartController');` (2认同)