簡體   English   中英

Laravel Form :: Model綁定-PUT / PATCH更新路由不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM