Laravel 5.4从请求对象重定向获取方法

时间:2017-06-12 12:17:05

标签: php laravel http-headers laravel-5.4 http-redirect

最近我开始了一个Laravel 5.4项目,我找到了一些我不太了解的东西,我发布了这个问题,希望能解决这个问题并找出它是预期的行为还是一个bug。

问题是,我正在提交一份类似的更新表格:

<form id="post-form" action="{{url('admin/posts/'.$post->id)}}" method="POST">
  {{ csrf_field() }}
  {{ method_field('PUT') }}
  <!-- Some fields -->
</form>

我尝试在控制器方法上验证该请求:

$validator = Validator::make($request->all(), [
        // Fields to validate
    ]);
if ($validator->fails()) {
   return back()
   ->withErrors($validator)
   ->withInput();
}

我的问题出现在验证失败并执行重定向时,因为我收到代码 405 错误MethodNotAllowedHttpException

确实,url是正确的,但方法是错误的,如HTTP标题中所示:

Request URL:https://myproject.dev/admin/posts/1/edit
Request Method:PUT
Status Code:405 
Remote Address:127.0.0.1:443
Referrer Policy:no-referrer-when-downgrade

应该是GET而不是PUT。我最好的猜测是使用$request对象的_method属性来重定向,而不是使用GET方法。

重定向呼叫之前的dump($request->all())

array:19 [
  "_token" => "XOtwEeXwgnuc8fNqCwxkdO992bU6FObDwTuCg1cJ"
  "_method" => "PUT"
  //fields
]

我已经尝试过一些没有运气的事情:

  • 从请求中取消设置_method:unset($request['_method'])
  • 根据该名称命名路线和重定向:

    // The routes file (routes/web.php)
    Route::get('posts/{id}/edit', 'PostsController@edit')->name('edit-post');
    
    // The redirect (controller)
    return redirect()->route('edit-post', ['id' => 1])
        ->withErrors($validator)
        ->withInput();
    
  • 指定重定向中的网址

    // The redirect (controller)
    return redirect('admin/posts/'.$post->id.'/edit')
        ->withErrors($validator)
        ->withInput();
    

那么我怎么能用普通的GET方法执行重定向呢?这是预期的行为吗?提前感谢您,非常感谢任何建议或提示。

1 个答案:

答案 0 :(得分:1)

您需要在routes.php文件中使用单独的放置路线。

Route::get('posts/{id}/edit', 'PostsController@edit')->name('edit-post');
Route::put('posts/{id}/edit', 'PostsController@edit')->name('edit-post');

get函数表示此路由将使用GET方法处理路由。您需要添加put以使用PUT方法处理请求。 the documentation中提供了所有可用的路线方法。

您还可以使用匹配功能在一行中匹配多个方法。像这样:

Route::match(['get', 'put'], 'posts/{id}/edit', 'PostsController@edit');