我设置路线以创建人员记录,如下所示:
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绑定的语法,我不理解。当我将请求作为参数传递时,PUT请求失败,因此我不理解POST和&之间的区别。在Laravel内部使用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
答案 0 :(得分:1)
您的控制器update
方法签名应如下所示,第一个参数为$request
,第二个参数为$id
。我也整合了一些逻辑,但这是可选的。
public function update(Request $request, $id)
{
$person = Person::findOrFail($id);
$person->update($request->all());
return view('person.update', compact('person'));
}
此外,考虑到网址结构相同,但您在表单定义中使用person.edit
而不是person.update
路由,并不重要。但我发现你有两条名为person.update
的路线。一个用于PUT
,另一个用于PATCH
。您可能需要小心重复使用相同的路由名称。
最后,如果使用Laravel Form
助手,您不需要自己添加csrf_field()
。这是自动添加的。
答案 1 :(得分:0)
我猜你有点困惑。首先,您应该清楚路由和资源控制器的工作方式。
您可以在此处找到您未知的重要信息: Resource Controllers
你可以试试这个:
<强> 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');
另外,不要将观点(人)与路线(制片人)混淆,因为你正在混合这些观点。
答案 2 :(得分:0)
您应该设置表单的method = "POST"
。使用{{method_filed('PUT')}}
方法时,在表单中添加PUT
。
与其他人一样。
答案 3 :(得分:-1)
您应该设置表单的<td>
。并且使用PUT方法时,格式为method = "POST"
。