我对Codeigniter相当新,我想知道一些Codeigniter最佳实践。我应该何时使用redirect()
与使用
$this->load->view
似乎当我使用redirect()
时,$this->session->set_flashdata
的工作方式应该如此,但是当我使用时
$this->load->view
在收到其他请求后会显示该消息。
答案 0 :(得分:6)
我认为你真的回答了自己的问题。
当另一页顶部的简单Flash消息是适当的响应时,使用redirect(),当您提供整页的反馈时,请使用$ this-> load-> view()传入的请求可能是。
因此,例如,当新用户注册时,“成功”页面将是加载的视图,并且可能当用户在其帐户中编辑某些内容时,在同一页面上的闪存消息“已保存更改”或类似内容就足够了。
答案 1 :(得分:5)
重定向对于其他两个常见问题也很有用:
答案 2 :(得分:4)
您的观察是正确的,无论何时创建一些flashdata
,它都只有时间可用。这是因为flashdata
只是session
的一种特殊类型,可以在下次请求时使用,在下一次请求后,它会自动删除。您不必处理它的删除。
可以使用以下代码进行测试:
$this->session->set_flashdata( 'test', 'testing' );
echo $this->session->flashdata( 'test' );
什么都不打印。但现在下次执行以下代码:
echo $this->session->flashdata( 'test' );
您将找到所需的输出。再做一次不会给出任何输出。这就是他们的工作方式。有关详情,请参阅http://codeigniter.com/user_guide/libraries/sessions.html
中的 Flashdata 部分对于当前页面,您不需要flashdata
只将数据传递给视图。这是代码:
$data['test'] = 'testing';
$this->load->view('sample_view', $data);
底线是flashdata
与redirect()
一起使用,对于视图,您应该传递变量。希望这有帮助!
答案 3 :(得分:1)
这很简单。你希望用户使用什么网址?如果它们在url1上并将数据发布回url1并且你只是加载一个不同的视图,它们仍将在url1上。如果你重定向到url2,他们将转到url2。
答案 4 :(得分:1)
您需要使用PRG - 发布/重定向/获取模式。 如果您在页面内容中包含该表单,则重定向和加载视图不会相同。
Scenario:
有一个视图,view_1带有表单,可以从帐户中扣款。在view_1中提交表单后,您希望跳转到view_2并显示成功消息,并且您有两个选项可以实现相同的目标。 1.使用成功消息加载view_2或2.使用闪存数据携带成功消息重定向到view_2。
选项1:使用成功消息加载view_2 当您提交表单并刷新时,它将导致重新提交并导致从帐户中多次扣款,但情况并非如此。你也可以看到提示弹出的信息"确认表格重新提交"。
选项2:这是正确的答案 PRG
PRG - 发布/重定向/获取 PRG是一种Web开发设计模式,可以防止一些重复的表单提交,这意味着,提交表单(view_1) - >重定向 - >获取(view_2)
Under the hood
重定向状态代码 - 使用HTTP 302的HTTP 1.0或使用HTTP 303的HTTP 1.1
带有重定向状态代码的HTTP响应还将在位置标题字段中提供URL。通过具有该代码的响应来邀请用户代理(例如,web浏览器),以对位置字段中指定的新URL做出第二个(否则相同的)请求。
重定向状态代码是为了确保在这种情况下,Web用户的浏览器可以安全地刷新服务器响应,而不会导致重新提交初始HTTP POST请求。
Double Submit Problem
Post/Redirect/Get Solution