簡體   English   中英

如何在Play中實施流量控制?

[英]How to implement flow control in Play?

我們正在嘗試在Play中實現一些流控制,這是一個包含多個步驟的向導。 在Play中最佳做法是什么?

我們的要求:

  1. 應該允許多步流,例如step1-> step2-> step3-> step4->完成
  2. 應該能夠根據上下文更改順序或步驟,因此,如果用戶在步驟2上選中了一個復選框,則流程應為步驟1->步驟2->警告步驟->步驟5->完成
  3. 理想情況下,需要支持“返回”按鈕以在步驟之間返回

我們遇到的問題是,流程中的任何單個步驟都不知道下一步應該重定向到哪里,並且由於Play會話非常簡單,因此在此無濟於事。

這是我們目前擁有的解決方案:

  1. 使用@OneToMany public List<FlowStep> flowSteps在用戶對象中的數據庫中存儲Flow步驟
  2. 在用戶模型中提供方法以添加/刪除/跳過和更改為此用戶存儲的流程步驟的順序
  3. 正常執行步驟,通過表單操作導致“ doStep3”控制器等
  4. 實現使用“ @Before”和“ @After”攔截器的“流”控制器,以在處理當前步驟后正確重定向到下一步,未發現任何驗證錯誤
  5. 添加了Flows.next()控制器,該控制器重定向到下一步(用於“跳過”按鈕href)

該解決方案的缺點是什么? 有沒有更好的方法(可能是一些Play內置方法)來改進它?

您想要的是一個有限狀態機 要實現它,您需要一個知道步驟之間所有可能轉換的類。 然后,您可以為其提供當前步驟和任何相關輸入,它將返回輸出(其中輸出是下一個要呈現的視圖)。

然后,使用render重定向用戶,如下所示:

render("my/view/path.html", myparams);

這不是唯一的選擇,並且過渡的存儲將取決於您需要它們的復雜程度(可以為簡單的場景進行硬編碼,也可以為更復雜的場景存儲在數據庫中),但是它應該可以工作。

由於Play是無狀態的,因此您需要將信息保存在數據庫中(對於復雜的場景,您需要考慮幾個步驟的信息),或者,如果相關的觸發器只是少數,則將其存儲在cookie本身中。

當您將狀態機耦合到控制器時,我會避免使用@ Before / @ After。 理想情況下,您希望它們是獨立的,狀態機僅返回轉換,您可以稍后將其轉換為視圖路徑。 這將簡化變化的過渡。

如果情況不是非常復雜,我什至不用費心將它們存儲在數據庫中。 如果您希望它可重用且非常靈活,請執行此操作,否則僅“對其進行硬編碼”可能會更簡單。

您是否在Play文檔中檢查了此部分(快速閱讀):
http://www.playframework.org/documentation/1.2.4/model#stateless

它列出了您所要求的選項。

您可以嘗試將“ 播放緩存”機制用作偽會話來存儲經過驗證的步驟,而不是在數據庫中進行處理。 使用播放緩存將是一個更簡單的解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM