rest - 创建 REST API 时将动态资源 Controller 与 Laravel 嵌套的正确方法

标签 rest laravel routes controllers

我找到了有关处理嵌套资源 Controller 和传递多个约束的良好信息,但似乎没有找到有关此特定问题的任何信息(可能是因为我对这一切的思考都是错误的!)。

如果我想在我的 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 的性能)
  • /cars/performance(显示所有汽车的性能)
  • /汽车/性能/零件
  • /零件
  • /parts/1 等...(与上述汽车零件相同)

我是否必须以这种方式为大多数人创建路由和 Controller

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...
});

或者我在创建动态 Controller 时缺少一些技巧,例如只有 3 个(CarController、PartsController、PerformanceController)并处理代码中的不同路线?

最佳答案

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

就汽车/零件的性能而言,我想说这有点像“show”方法(因为性能本身不是一个实体),因此会在 Controller 中创建另一种方法,如下所示:

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 文档,必须在资源 Controller 之前定义非资源方法。

您还可以进一步采用此方法并实现路线模型绑定(bind),以便将 CarPart 模型的实例注入(inject)到 Controller 操作中,而不是ID:

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

以及一个示例 Controller 操作:

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

希望这有帮助。

关于rest - 创建 REST API 时将动态资源 Controller 与 Laravel 嵌套的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29255803/

相关文章:

php - laravel Route::resource() 在/create 路由中使用 show() 而不是 create()

php - 如何在 Symfony 2 中使用 Behat 和 Mink 测试 REST API

rest - 通过测试用例,同时给出 500 作为响应

angularjs - $stateProvider Angular 将 '/#' 添加到我的路线

unit-testing - Laravel 5.1 中的模拟请求用于(实际)单元测试

rest - EmberJS 处理从 REST Api 返回的复杂对象

asp.net Webforms MapPageRoute 优先顺序

.net - Powershell v3 Invoke-WebRequest HTTPS 错误

c++ - C++ API 的 REST 与 RPC

php - 对 api token 使用 Config 会出现错误 'URI must be a string or UriInterface' Laravel