【问题标题】:Laravel parse variable from Form to Controller method via RouteLaravel 通过 Route 将变量从 Form 解析到 Controller 方法
【发布时间】:2019-05-09 19:19:32
【问题描述】:

我正在尝试在不使用资源的情况下更新对帖子的编辑。我尝试使用 {id} 将变量从我的表单解析到我的路由,但它被忽略了。这是我要发布的表单。

{!! Form:: open(['action'=> ['ManageBooksController@updateBook', $book->id], 'method' => 'POST']) !!}
<div class="form-group">
  {{Form::label('Book_NAME', 'Name')}}
  {{Form::text('Book_NAME', $book->Book_NAME, ['class' => 'form-control', 'placeholder' => 'Name'])}}
</div>
{{Form::hidden('_method', PUT)}}
{{Form::submit('Submit', ['class'=>'btn btn-primary'])}}
{!!Form:: close() !!}

这是我的路线

Route::put('manageBooks', 'ManageBooksController@updateBook');

这是我在控制器中的方法

public function updateBook(Request $request, $id)
{

    $this->validate($request, ['Book_NAME' => 'required']);

    $books = Books::find($id);
    $books->Book_NAME =$request->input('Book_NAME');
    $books->save();

    return redirect('/manageBook')->with('success', 'Book Edited');
}

【问题讨论】:

  • 首先要做的是将路由更改为Route::put('manageBooks/{id}', 'ManageBooksController@updateBook');

标签: php html sql laravel laravel-routing


【解决方案1】:

您的路线需要PATCH。尝试将您的路线更新到:

Route::post('/manageBooks/{id}', 'ManageBooksController@updateBook');

或者在表单中包含 Laravel 的 @method('PATCH')

另外,您的控制器名称不匹配 :)

【讨论】:

  • 谢谢我更新了控制器名称中的错误。我现在得到一个 MethodNotAllowedExcetion 生病尝试 @method('patch')
【解决方案2】:

考虑改变函数参数的顺序:

public function updateBook($id, Request $request)  // Notice the sequence of the arguments
{
    ......
}

【讨论】:

  • 尝试一下,如果您正在获取所有其他 POST 数据,而不仅仅是 url 中的 ID。这应该有效。
【解决方案3】:

如果你想使用路由,你必须像这样的细节

{!! Form:: open(['route'=> ['manage_book', $book->id], 'method' => 'POST']) !!}

在您的路线中,您可能需要正确命名它

Route::post('/manageBooks/{id}', array('as'=>'manage_book','uses'=>'ManageBooksController@updateBook'));

希望对你有帮助。

【讨论】:

    【解决方案4】:

    不使用资源更新:

    你的路线:

    Route::get('/manageBooks', 'ManageBooksController@whateverer')-&gt;name('manageBooks');

    Route::post('/manageBooks/{id}/edit', 'ManageBooksController@updateBook')-&gt;name('updateBook');

    你的刀片:

    {!! Form:: open(['route'=> ['updateBook', $book->id], 'method' => 'POST']) !!}
    <div class="form-group">
      {{Form::label('Book_NAME', 'Name')}}
      {{Form::text('Book_NAME', $book->Book_NAME, ['class' => 'form-control', 'placeholder' => 'Name'])}}
    </div>
    {{Form::hidden('id', $book->id)}} //hidden field is not required
    {{Form::submit('Submit', ['class'=>'btn btn-primary'])}}
    {!!Form:: close() !!}
    

    你的控制器:

    public function updateBook(Request $request, $id)
    {
    
        $this->validate($request, ['Book_NAME' => 'required']);
    
        $books = Books::where('id',$id)->update(['Book_NAME'=>$request->Book_NAME]);
        return redirect()->route('manageBooks')->with('success', 'Book Edited');
    }
    

    【讨论】:

    • 我添加了这个但我只是得到一个空白页:(
    • 返回 $books.chek 输出;
    • 您创建了没有参数的“/manageBook”路由,或者您使用的是相同的更新路由器?
    • 我刚刚改变了我的问题,这是我最接近它的工作,所以它现在给出了我的更新请求,但它缺少我的 id 参数
    【解决方案5】:

    最后,我添加了另一个隐藏字段,通过我正在编辑的帖子解析 ID。我还更改了 find 方法以将请求变量指向 ID。

    我的表格:

    {{Form::hidden('Book_ID', $book->Book_ID)}}
    {{Form::hidden('_method', PUT)}}
    {{Form::submit('Submit', ['class'=>'btn btn-primary'])}}
    {!!Form:: close() !!}
    

    我的功能:

    public function updateBook(Request $request)
    {
    
    $this->validate($request, ['Book_NAME' => 'required']);
    
    $books = Books::find($request->Book_ID);
    $books->Book_NAME =$request->input('Book_NAME');
    $books->save();
    
    return redirect('/manageBook')->with('success', 'Book Edited');
    }
    

    【讨论】:

      【解决方案6】:

      将您的方法 POST 从第一个更改为 PUT,

      {!! Form:: open(['action'=> ['ManageBooksController@updateBook', $book->id],'method' => 'PUT']) !!}
      <div class="form-group">
          {{Form::label('Book_NAME', 'Name')}}
          {{Form::text('Book_NAME', $book->Book_NAME, ['class' => 'form-control', 'placeholder' => 'Name'])}}
      </div>
      {{Form::submit('Submit', ['class'=>'btn btn-primary'])}}
      {!!Form:: close() !!}
      

      那么你必须在你的路由中传递一个参数,因为你的方法期望 $id

      Route::put('manageBooks/{id}/update', 'ManageBooksController@updateBook');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-13
        • 1970-01-01
        • 2014-06-23
        • 2014-03-15
        • 2016-07-19
        • 2020-01-27
        • 2017-02-27
        • 2017-01-14
        相关资源
        最近更新 更多