Как реализовать управление потоком в Play?
Мы пытаемся реализовать управление потоком в Play, что-то вроде мастера с несколькими шагами. Как лучше всего делать это в Play?
Требования у нас есть:
- Следует разрешить многоступенчатые потоки, такие как step1 -> step2 -> step3 -> step4 -> finish
- Должен быть в состоянии изменить порядок или шаги в зависимости от контекста, поэтому, если пользователь устанавливает флажок на шаге 2, последовательность действий должна быть шагом 1 -> шаг 2 -> предупреждение Step -> шаг 5 -> закончить
- В идеале требуется поддержка кнопки "Назад" для возврата между шагами
Проблема, которую мы имеем, состоит в том, что любой отдельный шаг в потоке не знает, куда он должен перенаправить дальше, и, поскольку сеанс Play очень прост, он не сильно поможет.
Вот решение, которое мы имеем в настоящее время:
- Сохранять шаги потока в базе данных в пользовательском объекте с помощью
@OneToMany public List<FlowStep> flowSteps
- Предоставьте методы в пользовательской модели для добавления / удаления / пропуска и изменения порядка шагов потока, сохраненных для этого пользователя
- Выполните шаги нормально, с действием формы, ведущим к контроллеру "doStep3" и т. Д.
- Реализуйте контроллер "Потоки", который использует перехватчики @Before и @After для правильного перенаправления на следующий шаг после обработки текущего шага и отсутствия ошибок проверки
- Добавлен контроллер 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 было бы более простым решением