为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
侃侃无极 2022-06-17 15:36:08
我使用以下命令为 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 传递给我的函数的东西。我该如何解决?
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

我认为您可以通过添加选项参数来解决您的问题。


Route::resource('peopleDatas', 'API\PeopleDataController',[

    'parameters' => ['peopleDatas' => 'peopleData'],

]);

laravel 强制你使用某些约定。当您为非数据透视表使用带下划线的表名时,您将开始遇到问题。选项参数允许您解决此问题。


查看完整回答
反对 回复 2022-06-17
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

我发现了这个问题。实际上,我发现它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再次工作!对我来说,当我们在前面提到变量的类型时,变量的名称会影响功能,这让我感到惊讶。


查看完整回答
反对 回复 2022-06-17
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

在 Laravel 中有一个叫做Route Model Binding的东西。因此,当您访问如下路线时:


/api/peopleDatas/1234

雄辩的接受模型而不是身份。您可以通过以下方式进行检查:


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

{

    return $peopleData->id; // or any other column 

}


查看完整回答
反对 回复 2022-06-17
  • 3 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信