【问题标题】:Laravel Form::Model Binding - PUT/PATCH Update Routing not workingLaravel Form::Model Binding - PUT/PATCH 更新路由不起作用
【发布时间】:2017-11-10 20:29:15
【问题描述】:

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

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 请求失败,所以我也不明白 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  

【问题讨论】:

    标签: php laravel-5 eloquent laravel-blade


    【解决方案1】:

    您的控制器 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()。这是自动添加的。

    【讨论】:

      【解决方案2】:

      我猜你有点困惑。首先,你应该清楚路由和资源控制器是如何工作的。

      您可以在这里找到重要的信息: 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');

      另外,不要将视图(人)与路线(车身制造商)混淆,因为您正在混合使用这些视图。

      【讨论】:

        【解决方案3】:

        你应该设置表单的method = "POST"。并且在使用PUT方法时在表单中添加{{method_filed('PUT')}}

        其他人也一样。

        【讨论】:

          【解决方案4】:

          你应该设置method = "POST"的表格。并在使用 PUT 方法时在表单中添加{{method_field('PUT')}}

          【讨论】:

            猜你喜欢
            • 2017-02-28
            • 1970-01-01
            • 1970-01-01
            • 2015-09-07
            • 2018-02-17
            • 2015-02-03
            • 2015-08-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多