如何在 update 和 destroy 方法而不是 id 中接收对象本身?

我使用以下命令为 Restful API 创建了一个控制器:


php artisan make:controller API\PeopleDataController --api -m PeopleData 

它使我成为具有以下方法的控制器:


/**

 * Update the specified resource in storage.

 *

 * @param  \Illuminate\Http\Request  $request

 * @param  \App\PeopleData  $peopleData

 * @return \Illuminate\Http\Response

 */

public function update(Request $request, PeopleData $peopleData)

{

    //

}


/**

 * Remove the specified resource from storage.

 *

 * @param  \App\PeopleData  $peopleData

 * @return \Illuminate\Http\Response

 */

public function destroy(PeopleData $peopleData)

{

    //

}

请注意函数的参数。我定义的路线也是这样的:


Route::middleware('auth:api')->group( function () {

    Route::resource('peopleDatas', 'API\PeopleDataController');

});

但是当我使用这样的 URL 发出 PUT 或 DELETE 请求时:


/api/peopleDatas/1234

我收到的update函数destroy不是 id 为 1234 的对象,而是 id 本身。另一方面,使用 artisan 创建的函数的签名必须是这样的:


 /**

 * Update the specified resource in storage.

 *

 * @param  \Illuminate\Http\Request  $request

 * @param  int  $id

 * @return \Illuminate\Http\Response

 */

public function update(Request $request, $id)

{

    //

}


/**

 * Remove the specified resource from storage.

 *

 * @param  int  $id

 * @return \Illuminate\Http\Response

 */

public function destroy($id)

{

    //

}

现在的问题是:如何从数据库中获取获取的对象而不是 id。显然,从 int 到模型对象的类型转换是不可能的,我们需要先从 DB 中获取它:


$peopleData = PeopleData::find($id);

似乎我错过了一些Laravel不会自动获取对象并将 id 传递给我的函数的东西。我该如何解决?


侃侃无极
浏览 119回答 3
3回答

明月笑刀无情

我认为您可以通过添加选项参数来解决您的问题。Route::resource('peopleDatas', 'API\PeopleDataController',[    'parameters' => ['peopleDatas' => 'peopleData'],]);laravel 强制你使用某些约定。当您为非数据透视表使用带下划线的表名时,您将开始遇到问题。选项参数允许您解决此问题。

缥缈止盈

我发现了这个问题。实际上,我发现它Laravel Route Model Binding是基于名称工作的,并且我Hungarian naming convention在函数签名中使用了:public function update(Request $oRequest, PeopleData $oPeopleData)而根据用户在这里提到的参数必须与模型同名。因此,通过将函数签名更改为其原始状态,如下所示:public function update(Request $request, PeopleData $peopleData)然后Laravel Route Model Binding再次工作!对我来说,当我们在前面提到变量的类型时,变量的名称会影响功能,这让我感到惊讶。

拉丁的传说

在 Laravel 中有一个叫做Route Model Binding的东西。因此,当您访问如下路线时:/api/peopleDatas/1234雄辩的接受模型而不是身份。您可以通过以下方式进行检查:public function update(Request $request, PeopleData $peopleData){    return $peopleData->id; // or any other column }
打开App,查看更多内容
随时随地看视频慕课网APP