Play 2.0.3 にいくつかのフロー制御を実装しようとしています。これは、いくつかのステップを持つウィザードのようなものです。Playでそれを行う最良の方法は何ですか?
step1→step2→finishのように多段フローにしたい
主な問題は、ユーザーがたとえばステップ 2 をスキップして、直接終了に進むことを許可しないことです (ユーザーはブラウザー/finishに手動でリンクを入力できます)。
ありがとう。うまく説明できていない場合はお知らせください。
Play 2.0.3 にいくつかのフロー制御を実装しようとしています。これは、いくつかのステップを持つウィザードのようなものです。Playでそれを行う最良の方法は何ですか?
step1→step2→finishのように多段フローにしたい
主な問題は、ユーザーがたとえばステップ 2 をスキップして、直接終了に進むことを許可しないことです (ユーザーはブラウザー/finishに手動でリンクを入力できます)。
ありがとう。うまく説明できていない場合はお知らせください。
少なくとも 2 つのオプションがあります。
完全にステートレスな方法は、ステップのURLにすべてのデータを格納することで構成できます。ここで、ステップにはステップn + 1
からのすべてのデータが含まれますn
。
GET /step1 controllers.Application.step1
GET /step2 controllers.Application.step2(dataFromStep1)
GET /step3 controllers.Application.step3(dataFromStep1, dataFromStep2)
POST /finish controllers.Application.finish
このソリューションの利点は、その単純さと、次のステップがPlayによって無料で実行される前に、必要なすべてのステップが完了していることを確認できることです。ルーター。
ただし、大量のデータがある場合、URLは膨大になるため、このソリューションの適用性は低くなります。このような場合、次のことを行う必要があります。
/step2
URLが異なるユーザーに対して同じものを返さないようにします。ステップをデータベース(長期)またはキャッシュ(短期)に保存します。このようにして、ロジックを構築if (secondQuestionAnswered) { .. }
し、ユーザーが何もスキップしていないこと、および/またはユーザーが必要なときに手順を完了できることを確認できます。また、アプリが大きくなり、スケーリングする必要がある場合は、DBまたはキャッシュに保持することもメリットがあります。