[英]Laravel Form::Model Binding - PUT/PATCH Update Routing not working
我設置了創建個人記錄的路線,如下所示:
Route::get('bodymaker/create', 'BodyMakerController@create')->name('bodymaker.create');
Route::post('bodymaker', 'BodyMakerController@store')->name('bodymaker.store');
Route::get('bodymaker/{id}/edit', 'BodyMakerController@edit')->name('bodymaker.edit');
Route::put('bodymaker/{id}/update', 'BodyMakerController@update')->name('bodymaker.update');
Route::patch('bodymaker/{id}', 'BodyMakerController@update')->name('bodymaker.update');
生成新記錄的控制器方法可以正常工作,如下所示:
public function create()
{
return View::make('bodymaker.create');
}
public function store(Request $request)
{
$person = new Person;
$person->first_name = $request->first_name;
$person->last_name = $request->last_name;
$person->save();
return View::make('person.store', ['person'=>$person]);
}
現在...我的問題是使編輯/更新表單正確綁定...
public function edit($id)
{
$person = Person::findOrFail($id);
return View::make('person.edit', ['person'=>$person]);
}
public function update($id)
{
// This route fails when I pass in the Request $request like in the store method.
//But how does the update method receive the form values differently than the store method(?)
$person = Person::findOrFail($id);
$person->first_name = $request->first_name;
$person->last_name = $request->last_name;
$person->save();
return View::make('person.update', ['person'=>$person]);
}
更新表單如下所示
{{ Form::model($person, ['route' => ['person.edit', $person->id], 'method' => 'PUT'] }}
{{ csrf_field() }}
{!! Form::text('first_name'), Input::old('first_name') !!}
{!! Form::text('last_name'), Input::old('last_name') !!}
{!! Form::submit('Update Person') !!}
{!! Form::close() !!}
我似乎無法獲得更新記錄的表單,只能生成新記錄。 我不了解Form :: model綁定的語法。 當我將Request作為參數傳遞時,PUT請求失敗,因此我也不理解Laravel內部使用的POST和PUT之間的區別,盡管我不確定那是我的問題
這是我的工匠路線:列表
| web,auth |||GET|HEAD| bodymaker/{id}/edit | bodymaker.edit | App\Http\Controllers\BodyMakerController@edit
| web,auth |||PUT | bodymaker/{id}/update| bodymaker.update| App\Http\Controllers\BodyMakerController@update
控制器update
方法簽名應如下所示,第一個參數$request
和第二個參數$id
。 我也合並了一些邏輯,但這是可選的。
public function update(Request $request, $id)
{
$person = Person::findOrFail($id);
$person->update($request->all());
return view('person.update', compact('person'));
}
此外,而不是它應該的問題,因為該URL結構是相同的,但您使用的person.edit
而不是person.update
在確定指標的形式路線。 但是我看到您有兩條路由稱為person.update
。 一個用於PUT
,另一個用於PATCH
。 您可能需要小心重用相同的路由名稱。
最后,如果使用Laravel Form
幫助器,則無需自己添加csrf_field()
。 這是自動添加的。
我想你有點困惑。 首先,您應該清楚路由和資源控制器的工作方式。
您可以在這里找到重要的信息: 資源控制器
您可以嘗試以下方法:
routes.php文件
Route::put('bodymaker/{id}', 'BodyMakerController@update')->name('bodymaker.update');
Controller.php這樣
public function update($id, Request $request)
{
$person = Person::findOrFail($id);
$person->update($request->all());
return view('person.edit', compact('person'));
}
form.blade.php
{!!Form::model($person,['url'=> ['bodymaker',$person->id],'method'=>'PUT'])!!}
.... your form
{!!Form::close()!!}
如我所見,您僅使用資源方法,因此,我建議使用資源豐富的路由,其動作與上面的鏈接中列出的相同,如下所示:
Route::resource('bodymaker', 'BodyMakerController');
另外,不要將視圖(人員)與路線(車身制造商)混淆,因為您正在混合使用這些視圖。
您應該設置表單的method = "POST"
。使用PUT
方法時,在表單中添加{{method_filed('PUT')}}
。
與別人一樣。
您應該設置表單的method = "POST"
。 並在使用PUT方法時以{{method_field('PUT')}}
的形式添加。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.