使用PHP中的MVC进行重定向后获取(PRG)的最佳实践

Enr*_*que 9 php model-view-controller post-redirect-get

MVC的PRG模式有哪些最佳实践?
在本教程:
http://www.theserverside.com/news/1365146/Redirect-After-Post
所提出的解决方案要求4个动作:
Create_Item(POST)=> "复位"的形式,并且重定向到Display_Item
Display_Item(GET)= >显示表单(具有临时数据和错误,如果存在)
Store_Item(POST)=>尝试将数据保存到DB,如果错误,保存错误并重定向到Display_Item,如果成功重定向到Display_Stored
Display_Stored(GET)=>显示项目创建或成功的消息,tec.

现在,我认为使用POST进行第一个操作是一个问题,因为我们无法使用链接启动表单.在Create_Item中使用GET 似乎是一个更好的选择.
此外,我们可以对3个操作执行相同的操作(对Create_Item和Display_Item使用相同的操作,但使用额外的标志重置表单,例如:
http ://www.example.com/controller/Create_Item/? reset = 1

而且我们也可以只用2个动作做同样的事情,因为我们可以在Create_Item里面使用if 来检查请求是GET还是POST(所以我们将Display_Item与Store_Item结合起来).

而且我们也可以做同样的事情1个操作,因为我们可以有一个额外的标记(在URL查询或会话中)来显示结果而不是表单:
GET http://www.example.com/controller/Create_Item/?reset=1 =>显示一个新表单并重定向到下一个URL
GET http://www.example.com/controller/Create_Item/ =>显示一个包含临时数据和错误的表单(如果存在)
POST http://www.example.com/controller/ Create_Item / =>保存temp中的错误或DB中的数据(并设置成功的会话标志)并重定向到上面的URL或下一个URL
GET http://www.example.com/controller/Create_Item/ => if $ _SESSION ['success']显示结果

我个人喜欢有4个动作的想法,但我没有任何其他选项的真正优势.但是如果没有真正的标准,我选择我的设计并不安全.
有人知道每个设计的PROSCONS(如果有的话)吗?

例如,我看到4个动作更清晰,但如果我们想要更改临时数据的保存方式,我们需要在4个位置更改它.

谢谢!

Bry*_*ery 4

该模式是GET一个空白表单,修改表单的内容,然后POST将其发送到服务器,然后服务器将重定向发送到另一个页面,该页面是GET,可能是一个页面说Form submitted successfully.。(获取->)发布->重定向->获取

第一个动作其实并不是POST。这就是填写表格并提交的最终结果。该指南更多地介绍了之后要做什么POST,就好像您不进行重定向一样,然后用户会留在一个页面上,说明Form submitted successfully他们可以按 F5 并执行另一个操作POST。然而,通过该重定向,他们可以通过安全的方式进入该结果页面GET,这不会导致重复发布。

至于实现,您应该让每个操作在服务器端都有自己的操作。这与 MVC/RESTful 实现一致。

  • GET /url?action=new -> 调用 new_form() 方法渲染新表单
  • POST /url?action=create -> 调用create_form()方法保存并重定向到/url?action=show&id=1234
  • GET /url?action=show&id=1234 -> 调用 show_form() 方法显示结果
  • POST /url?action=save&id=1234 -> 调用 save_form() 方法保存并重定向

如果您想调用第二个操作,则可以在此处使用 3 个操作save。大多数 REST/CRUD 约定都使用 4,但选择权在您手中。其好处与首先采用 REST/MVC 路线相同。

另请参阅这些资源:

  • RESTful Web 服务
  • 涵盖了 RESTful 控制器的典型约定。它涵盖了 Rails,但如果您想采用 REST 路线,也仍然适用于 PHP。