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

Posted

技术标签:

【中文标题】Laravel 5.4 从请求对象重定向获取方法【英文标题】:Laravel 5.4 redirect taking method from request object 【发布时间】:2017-11-13 22:01:31 【问题描述】:

最近我开始了一个 Laravel 5.4 项目,我发现了一些我不太理解的东西,我发布了这个问题,希望能解决这个问题,看看它是预期的行为还是错误。

问题是,我正在提交一个如下所示的更新表单:

<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 headers所示:

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-&gt;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();

在重定向中指定 url

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

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

【问题讨论】:

【参考方案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中提供了所有可用的路由方法。


还可以使用 match 函数在一行中匹配多个方法。像这样:

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

【讨论】:

那么使用请求对象中存在的方法执行重定向是预期的行为吗?

以上是关于Laravel 5.4 从请求对象重定向获取方法的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.4 自动重定向到 404 页面

如何在 laravel 5.4 中实现 HTTPS

Laravel 5.4 登录后重定向到自定义 url

如果用户未使用中间件进行身份验证,Laravel 5.4 将重定向到特定页面

在laravel中发布请求后如何重定向回上一页?

laravel 5.4 使用 ajax 登录。身份验证成功,但 redirectTo 属性不起作用并保持重定向到“/home”