Laravel Form ::模型绑定 - PUT / PATCH更新路由无法正常工作

时间:2017-06-09 00:02:23

标签: php laravel-5 eloquent laravel-blade

我设置路线以创建人员记录,如下所示:

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  

4 个答案:

答案 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"