【问题标题】:Can a Laravel POST route return a view instead of redirecting to another route?Laravel POST 路由可以返回一个视图而不是重定向到另一个路由吗?
【发布时间】:2021-08-26 17:32:46
【问题描述】:

我已经看到/参与过许多 Laravel POST 路由如下所示的项目:

Route::post('/some-url', [SomeController::class, 'someMethod']);

控制器及其方法处理路由,如下所示:

class SomeController extends Controller
{
    public function someMethod(Request $request) {
        // My Logic to do something with the post data - $request
        return redirect("/some-other-url");
    }
}

按照惯例,在处理 POST 数据后总是会重定向到特定的 URL。

我想知道,如果在处理了一个 POST 请求之后,是否可以像我们对 GET 请求一样返回一个视图?我知道它有效,但这只是惯例还是这样做有什么问题?

例如:

class SomeController extends Controller
{
    public function someMethod(Request $request) {
        // My Logic to do something with the post data - $request
        return view("somebladeview")->with(["result" => $result ]);
    }
}

【问题讨论】:

  • 是的,当然可以在向控制器发出 POST 请求后返回视图。这主要是当有一些敏感信息通过前端使用 POST 请求提交到服务器时,我们需要处理它并在另一个视图中向用户显示计算的响应。对此没有任何限制。如果您的项目需要,请继续返回视图而不是重定向响应。我们已经做过无数次了。事实上,如果我可以这么说的话,大多数开发人员都这样做了。
  • 是的,post 请求可以做到这一点,如果你查看在 Laravel 中实现的任何 API,它们都会返回 JSON。如果是用户表单提交等,则从发布请求执行重定向现在被认为是最佳实践。
  • 感谢您的澄清,@Salvino 和 Peter Fox。
  • 该模式称为post-redirect-get, or PRG。这是约定,因为POST should be used for requests that change data,而 GET 应该用于简单地显示数据。如果您在 POST 之后返回视图,用户可以点击重新加载,并且(可能无意中)再次更改数据,例如第二次购买东西。通过使用 PRG,用户点击重新加载只是重新加载最后一个 GET,它只是重新显示一些东西。我不同意上面的建议,忽略这个约定。
  • 谢谢@Don'tPanic。我完全同意,因为正如您所说,当我在结束屏幕(POST 后显示的视图)上点击重新加载时,浏览器会要求“确认我的重新提交”,这不是我打算保留的行为。所以你的应该是我问题的答案,我猜。再次感谢。

标签: laravel post


【解决方案1】:

该模式称为post-redirect-get, or PRG。这是约定,因为POST should be used for requests that change data,而 GET 应该用于简单地显示数据。

如果您在 POST 之后返回视图,则用户可以点击重新加载,并且(可能无意中)再次更改数据,例如再次购买东西。通过使用 PRG,用户点击重新加载只是重新加载最后一个 GET,它只是重新显示一些东西。

注意: cmets 中有一些关于您的问题的建议,可以忽略此约定。我认为这是不明智和危险的,这些约定的存在是有充分理由的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-19
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多