【发布时间】: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 后显示的视图)上点击重新加载时,浏览器会要求“确认我的重新提交”,这不是我打算保留的行为。所以你的应该是我问题的答案,我猜。再次感谢。