4

我以前总是写$this->load->view()来加载视图。我注意到有一个问题,特别是在地址栏中重新提交和 URL 时。相反,我开始使用redirect('controller/function','refresh')来实现同样的目标。我的问题是:这是一个好的方法还是不赞成?我觉得我的代码这样更流畅,但我当然想知道这以后是否有任何副作用。

例如用例:

$id = $this->user_model->buildAccount($name, $email);

if(isset($id) && $id != '') {
    $this->session->set_userdata('id', $id);
    redirect('users/details');
} else {
    redirect('members/');
}
4

2 回答 2

3

当涉及到CI您采取的任何方法时,恕我直言,您的方法很好。在上面的代码中,您在创建会话后重定向用户,您还应该在user/details函数中检查会话的有效性。无论如何,您必须调用load->view()以加载视图,无论是在任何函数中。所以,在哪里加载视图并不重要。

于 2013-10-17T06:45:22.647 回答
2

您需要使用 PRG - Post/Redirect/Get 模式。 如果页面内容中有表单,则重定向和加载视图是不一样的。

Scenario:

有一个视图 view_1,其中包含用于从帐户中借钱的表单。在 view_1 中提交表单后,您想跳转到 view_2 并显示成功消息,并且您有 2 个选项可以实现相同的目的。1. 加载带有成功消息的 view_2 或 2. 使用带有成功消息的闪存数据重定向到 view_2。

选项1:加载view_2并显示成功消息当您提交表单并刷新时,会导致重新提交并导致帐户多次扣款,这不应该是这种情况。您也可以看到弹出“确认重新提交表单”的警报。

选项 2:这是正确的答案 PRG

PRG - 发布/重定向/获取 PRG 是一种 Web 开发设计模式,可防止某些重复的表单提交,这意味着,提交表单 (view_1) -> 重定向 -> 获取 (view_2)

Under the hood

带有此状态代码的 HTTP 响应将在位置标头字段中另外提供一个 URL。带有此代码的响应邀请用户代理(例如 Web 浏览器)向位置字段中指定的新 URL 发出第二个(否则相同)请求。

带有 HTTP 302 的 HTTP 1.0 或带有 HTTP 303 的 HTTP 1.1(“查看其他”)响应代码,以确保在这种情况下,Web 用户的浏览器可以安全地刷新服务器响应,而不会导致重新提交初始 HTTP POST 请求。

资源

于 2015-09-30T12:45:28.857 回答