Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建RESTAPI时使用Laravel嵌套动态资源控制器的正确方法_Rest_Laravel_Routes_Controllers - Fatal编程技术网

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

创建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等。。。(与上述汽车零件相同)

我在处理嵌套资源控制器和传递多个约束方面找到了很好的信息,但在这个特定问题上似乎什么也找不到(可能是因为我想的全是错的!)

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

  • /汽车(显示所有汽车)
  • /车辆/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您是对的。如果使用点,该参数将自动生成。