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

时间:2011-05-08 22:15:44

标签: 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)=>尝试将数据保存到数据库,如果错误,保存错误并重定向到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个动作做同样的事情,因为我们可以使用if in Create_Item 来检查请求是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/ =>如果$ _SESSION ['success']显示结果

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

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

谢谢!

1 个答案:

答案 0 :(得分:4)

模式是GET一个空白表单,修改表单的内容,然后POST到服务器,然后将重定向发送到另一个页面GET ,也许到一个页面说Form submitted successfully.。 (的Get-&GT)后> Redirect->获得

第一个动作不是POST。这是填写表格并提交表格的最终结果。该指南更多地是关于在POST之后要做什么,好像你没有进行重定向,然后用户留在一个页面上Form submitted successfully,他们可以点击F5然后再做另一个{{} 1}}。然而,通过该重定向,他们通过安全POST在结果页面上,这不会导致双重帖子。

至于实现,你应该在服务器端各自拥有自己的动作。这与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()方法来保存和重定向

如果您想要进行第二次操作调用GET,可以在此处使用3个操作。大多数REST / CRUD约定使用4,但选择权在您手中。其优点与首先使用REST / MVC路由相同。

请参阅以下资源:

  • RESTful web services
  • This涵盖了RESTful控制器的典型约定。它涵盖了rails,但如果您想要使用REST路由,它仍然适用于PHP。