【问题标题】:Laravel redirect after update uses PUT request更新后 Laravel 重定向使用 PUT 请求
【发布时间】:2018-05-04 02:52:27
【问题描述】:

我在前端有带有 Vue 的 Laravel 应用程序,Vue 使用 PUT 请求从控制器调用更新方法。

请求有效,模型得到更新,但我在重定向时遇到问题,因为它也重定向为 PUT 而不是简单的 GET

public function update(MomentsValidationRequest $request, Project $project, Task $task, Moment $moment)
{
    foreach($request->materials as $material){
        $material_id_array[$material['id']] = ['quantity' => $material['quantity']];
    }

    $moment->update($request->all());

    if(isset($material_id_array))
        $moment->materials()->sync($material_id_array);

    return redirect()->back()->with(['alert-type' => 'success', 'message' => 'Moment updated!']);
}

所以很自然,我得到了一个方法不允许的异常,因为它正在重定向到一个应该只获得前一个视图的路由。

路由本身没问题,请求方法不行。

对于非信徒:)

也是一条路线:

【问题讨论】:

  • 您是否尝试在“路由”而不是控制器中定义重定向?
  • 你是什么意思,使用新的 Laravel 的Route::redirect()
  • 您只是想在控制器完成后将它们重定向回来,对吗?您很可能定义了一个向此处指定的控制器发送请求的 Route。您可以将back() 方法定义为路由本身的返回值,而不是在此控制器中定义重定向。这是“创建重定向”下方的示例laravel.com/docs/5.5/redirects
  • 我不觉得关闭是去这里的方式。另外,我需要重定向到/task/{id},这是不可能在重定向路由上转发而不复杂

标签: php laravel laravel-5 laravel-request laravel-response


【解决方案1】:

我知道这有点晚了。但是以防有人偶然发现这一点。

您声明您在前端使用 Vue。这表明 put 请求是通过 axios 调用发出的。

我看不到这个电话,所以这只是一个假设。但我相信解决方案是在控制器中返回一个 json 对象而不是响应,然后重定向触发来自 Vue 组件本身的重定向。

在控制器中:

Session::flash('alert-type', 'success');
Session::flash('message', 'Moment updated!');

return response()->json(true);

在组件中:

axios.post('/moments', this.moment).then(() => {
    window.location.replace("moments");
});

我认为这与 axios 处理补丁请求的方式有关,它似乎试图自动处理重定向响应,但我可能是错的,所以如果有更好的解释,欢迎任何回复。

【讨论】:

  • 我遇到了几乎完全相同的问题,这是行之有效的解决方案。我以为我可以使用路由、消息和 303 状态码进行重定向,但无法正常工作。
【解决方案2】:

你可以使用:

redirect()->back(303)->with(...)

【讨论】:

    【解决方案3】:

    不,重定向总是使用GET,但您没有定义这样的路由。所以你应该创建GET 路由来做一些事情。

    只能重定向到GET 路由。

    【讨论】:

    • 这是真的吗? laravel.com/docs/5.5/redirects 显示了一个使用带有 POST 请求的重定向的示例。从技术上讲不是redirect() 方法,但它通过将用户返回到上一页来做同样的事情。
    • 它在 POST 请求中完成,但它被重定向到可通过 GET 访问的路由。总是通过 GET 重定向到可用的路由
    • @Norgul 我明白了,但问题可能出在 Vue 内部——你在某处发出 PUT 请求而不是 GET。在 Laravel 后端重定向将使用 GET
    • 但这很奇怪,因为 Vue 代码进入了方法,我尝试转储 $request->method() 并显示 PUT...我不明白这是怎么可能的
    • 真的不知道,但它一定是在 Vue 中的某个地方或您的问题中未包含的系统的其他部分
    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2014-09-05
    • 2021-05-08
    • 2018-11-06
    相关资源
    最近更新 更多