我们正在尝试在Play中实现一些流控制,这是一个包含几个步骤的向导。在Play中执行此操作的最佳做法是什么?
我们的要求:
我们遇到的问题是,流程中的任何一个步骤都不知道下一步应该重定向的位置,因为Play会话非常简单,所以在这里没有多大帮助。
以下是我们目前的解决方案:
@OneToMany public List<FlowStep> flowSteps
此解决方案有哪些缺点?有没有更好的方法(可能是一些Play内置方法)来改进它?
答案 0 :(得分:2)
你想要的是finite state machine。要实现它,您需要一个知道步骤之间所有可能转换的类。然后你可以提供当前步骤和任何相关输入,它将返回输出(输出是下一个渲染的视图)。
然后使用render重定向用户,如:
render("my/view/path.html", myparams);
这不是唯一的选择,转换的存储将取决于您需要它们的复杂程度(可以针对简单场景进行硬编码,也可以存储在数据库中以用于更复杂的场景),但它应该可以工作。
由于Play是无状态的,您需要将信息保存在数据库中(对于需要在几个步骤中获取帐户信息的复杂方案),或者,如果相关的工具只是少数,则将它们存储在饼干本身。
当你将状态机耦合到控制器时,我会避免使用@ Before / @ After。理想情况下,您希望它们是独立的,状态机只返回可以在以后转换为视图路径的转换。这将简化转换过程。
如果场景不是非常复杂,我甚至不愿意将它们存储在数据库中。如果你想要它可重复使用并且非常灵活,那就去做吧,否则它可能更简单,只需要对它进行硬编码即可。
答案 1 :(得分:2)
您是否在Play文档中查看了此部分(非常快速阅读):
http://www.playframework.org/documentation/1.2.4/model#stateless
它列出了您所要求的选项。
答案 2 :(得分:1)
您可以尝试使用Play Cache mechanism作为伪会话来存储已验证的步骤,而不是在数据库中进行处理。使用Play Cache将是一个更简单的解决方案