Как реализовать управление потоком в Play?

Мы пытаемся реализовать управление потоком в Play, что-то вроде мастера с несколькими шагами. Как лучше всего делать это в Play?

Требования у нас есть:

  1. Следует разрешить многоступенчатые потоки, такие как step1 -> step2 -> step3 -> step4 -> finish
  2. Должен быть в состоянии изменить порядок или шаги в зависимости от контекста, поэтому, если пользователь устанавливает флажок на шаге 2, последовательность действий должна быть шагом 1 -> шаг 2 -> предупреждение Step -> шаг 5 -> закончить
  3. В идеале требуется поддержка кнопки "Назад" для возврата между шагами

Проблема, которую мы имеем, состоит в том, что любой отдельный шаг в потоке не знает, куда он должен перенаправить дальше, и, поскольку сеанс Play очень прост, он не сильно поможет.

Вот решение, которое мы имеем в настоящее время:

  1. Сохранять шаги потока в базе данных в пользовательском объекте с помощью @OneToMany public List<FlowStep> flowSteps
  2. Предоставьте методы в пользовательской модели для добавления / удаления / пропуска и изменения порядка шагов потока, сохраненных для этого пользователя
  3. Выполните шаги нормально, с действием формы, ведущим к контроллеру "doStep3" и т. Д.
  4. Реализуйте контроллер "Потоки", который использует перехватчики @Before и @After для правильного перенаправления на следующий шаг после обработки текущего шага и отсутствия ошибок проверки
  5. Добавлен контроллер Flows.next(), который перенаправляет на следующий шаг (используется для ссылки "Пропустить")

Каковы недостатки этого решения? Есть ли лучший способ (может быть, некоторые встроенные методы Play), чтобы улучшить его?

3 ответа

Решение

То, что вы хотите, это конечный автомат. Для его реализации вам понадобится класс, который знает все возможные переходы между шагами. Затем вы можете предоставить ему текущий шаг и любые соответствующие входные данные, и он вернет выходные данные (где выходные данные представляют собой представление, которое будет отображаться следующим).

Затем вы используете render для перенаправления пользователя, как в:

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

Это не единственный вариант, и хранение переходов будет зависеть от того, насколько сложными они вам нужны (могут быть жестко заданы для простых сценариев, могут быть сохранены в базе данных для более сложных), но это должно работать.

Так как Play не имеет состояния, вам нужно хранить информацию в базе данных (для сложных сценариев, когда вам нужно учитывать информацию в течение нескольких шагов) или, если релевантных переключателей всего несколько, сохранять их в самом файле cookie.

Я бы не использовал @Before/@After, так как вы соединяете конечный автомат с контроллером. В идеале вы хотите, чтобы они были независимыми, так как конечный автомат возвращает только те переходы, которые вы позже сможете преобразовать в пути просмотра. Это упростит изменение переходов.

Если сценарий не очень сложный, я бы даже не стал хранить их в базе данных. Если вы хотите, чтобы он был многоразовым и чрезвычайно гибким, то сделайте это, иначе может быть проще просто "жестко закодировать его".

Вы проверили этот раздел в документации Play (очень краткое чтение):
http://www.playframework.org/documentation/1.2.4/model

В нем перечислены варианты, которые у вас есть именно для того, что вы спрашиваете.

Вы можете попытаться использовать механизм Play Cache в качестве псевдосеанса для сохранения проверенных шагов вместо обработки в базе данных. Использование Play Cache было бы более простым решением

Другие вопросы по тегам