3

当我开始使用 ZF2 时,我使用的第一个模块是 ZfcUser。当我调试它的控制器代码时,我发现了一种奇怪的方式(至少对我来说)来管理操作。我找到了类似的代码

    $prg = $this->prg('zfcuser/changepassword');

    if ($prg instanceof Response) {
        return $prg;
    } elseif ($prg === false) {
        return array(
            'status' => $status,
            'changePasswordForm' => $form,
        );
    }

    //VALIDATE FORM AND DATABASE STUFF
    (...)

行为如下:

  1. 第一次加载 $prg 是假的,所以它返回表单。
  2. 当您提交页面时,$prg 是 Response 的一个实例,因此它返回 $prg。
  3. 当返回 $prg 时,再次调用相同的函数并且 $prg 变成一个包含所有已发布数据的数组,因此它跳转到表单和数据库内容的验证。

我认为这是一种奇怪的方法,所以我用简单的 request->isPost() 覆盖了所有需要的函数。我发现处理发布的第一个负载/数据更容易。

直到现在我才更加重视它。当我尝试上传文件时,我再次面临 Post-Redirect-Get 方法:似乎需要防止用户在表单上出现验证错误时重新选择文件并重新上传。

Post-Redirect-Get 的意义何在?你什么时候推荐使用它(除了评论文件上传)?

4

1 回答 1

1

正如文档所述:

当用户发送 POST 请求时(例如,在提交表单后),他们的浏览器会尝试保护他们免于再次发送 POST,破坏后退按钮,导致浏览器警告和弹出窗口,有时还会重新发布表单。相反,当接收到 POST 时,我们应该将数据存储在会话容器中,并将用户重定向到 GET 请求。

所以这个插件的目的是改善用户体验。当您提交表单并尝试刷新页面时,您一定遇到过这个问题,您会收到一条弹出消息,例如(来自 google chrome 的示例):

确认重新提交表单:您正在查找的页面使用了您输入的信息。返回该页面可能会导致您重复执行的任何操作。你要继续吗?

如果您的表单处理文件上传,您可以在Post/Redirect/Get PluginFile Post/Redirect/Get Plugin的文档中获得更多详细信息。

注意:对于File Post/Redirect/Get Plugin - Example Usage,第 16 行有一个错字,您应该使用$this->filePrg()而不是$this->prg(). 它应该像下面的行。

$prg = $this->filePrg($myForm, '/user/profile-pic', true);
于 2013-04-07T21:51:39.890 回答