创建RESTAPI时使用Laravel嵌套动态资源控制器的正确方法
我在处理嵌套资源控制器和传递多个约束方面找到了很好的信息,但在这个特定问题上似乎什么也找不到(可能是因为我想的全是错的!) 如果我想在API中创建以下内容创建RESTAPI时使用Laravel嵌套动态资源控制器的正确方法,rest,laravel,routes,controllers,Rest,Laravel,Routes,Controllers,我在处理嵌套资源控制器和传递多个约束方面找到了很好的信息,但在这个特定问题上似乎什么也找不到(可能是因为我想的全是错的!) 如果我想在API中创建以下内容 /汽车(显示所有汽车) /车辆/1(显示carId=1) /cars/1/性能(显示carId=1的性能) /汽车/1/性能/零件(显示carId=1的零件性能) /汽车/1/性能/零件/1(显示carId=1时partId=1的性能) /车辆/性能(显示所有车辆的性能) /汽车/性能/零件 /零件 /零件/1等。。。(与上述汽车零件相同)
- /汽车(显示所有汽车)
- /车辆/1(显示carId=1)
- /cars/1/性能(显示carId=1的性能)
- /汽车/1/性能/零件(显示carId=1的零件性能)
- /汽车/1/性能/零件/1(显示carId=1时partId=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)和处理代码中的不同路由时,我是否缺少一些技巧?我认为您需要的是嵌套的资源控制器。这些允许您构建类似于/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
}
}
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');
那么您的路线将如下所示:
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', 'CarController@performance');
Route::get('car/{car}/part/{part}/performance', 'CarPartController@performance');
Route::resource('car', 'CarController');
Route::resource('car/{car}/part', 'CarPartController');
根据Laravel文档,必须在资源控制器之前定义非资源方法
您还可以进一步采用此方法并实现路线-模型绑定,以便将汽车
和零件
模型的实例注入控制器操作,而不是ID:
Route::model('car', 'Car');
Route::model('part', 'Part');
以及控制器动作示例:
public function performance(Car $car, Part $part)
{
// Show performance for specified part on specified car
}
希望这能有所帮助。谢谢,太好了,这正是我所需要的。当您第一次开始使用routes、mvc和RESTAPI时,有很多概念需要您理解,因此应用它们有时可能会令人困惑!我想接下来的问题是,这是否符合REST原则,因为一旦我开始使用Route::get('car/{car}/performance','CarController@performance'); 那么,我是不是不再严格遵守GET/PUT/DELETE等REST原则了?您不需要添加包含通配符的段,您可以这样编写:
Route::resource('car.part','CarPartController')代码>@cdarken这不是通配符。这是一个路由参数。@MartinBean您是对的。如果使用点,该参数将自动生成。