Как стать автором
Обновить

Реализация состояний для веб-приложения

Kohana
Возникал такая проблема. Для разных разделов веб-приложения необходимо было хранить состояния наборов параметров. Далеко ходить не нужно: значения в сессии или куки. Но управление значениями улжнилось тем, что при выходе из раздела состояния должны были терятся.

Ничего особо финтового в примере нет. Просто хелпер из трех функций: одна устанавливает состояние параметра, одна возвращает, одна сбрасывает. Значения храним в сессии.
Основная идея — в том что имя контроллера так же хранится в сессии, и при обращении к состоянию проверяется совпадение имени «последнего» контроллера и «активного». Если совпадают — возвращаем состояние. Если нет — устанавливаем дефолтовые значения состояний и возвращаем дефолтовое.

Такая схема позволяет:
  • свести работу с состояниями к статическому контроллеру и не оперирывать живыми переменными
  • вынести установку дефолтовых значений всех состояний системы в одно место


  1. class cnd_Core
  2. {
  3. public static function get($cnd_name)
  4. { //установка значения состояния
  5. if(Session::instance()->get('cnd_controller') != Router::$controller)
  6. { //если имеет место переход в новый раздел - устанавливаем дефолтовые состояния
  7. Session::instance()->set('cnd_controller', Router::$controller);
  8. switch (Session::instance()->get('cnd_controller'))
  9. {
  10. case 'razdel1':
  11. Session::instance()->set('razdel1_value1', 0);
  12. Session::instance()->set('razdel1_value2', 0);
  13. break;
  14. case 'razdel2':
  15. Session::instance()->set('razdel2_value1', 0);
  16. Session::instance()->set('razdel2_value2', 0);
  17. break;
  18. case 'razdel3':
  19. Session::instance()->set('razdel3_value1', 0);
  20. Session::instance()->set('razdel3_value2', 0);
  21. break;
  22. }
  23. }

  24. //возвращаем значение состояния, дефолтовое, сохраненное или NULL
  25. $v = Session::instance()->get($cnd_name, NULL);
  26. return $v;
  27. }

  28. public static function set($cnd_name, $cnd_val)
  29. { //устанавливаем значение состояния
  30. Session::instance()->set($cnd_name, $cnd_val);
  31. }

  32. public static function drop()
  33. { //сбрасываем все сохраненные состояния к дефолтовым
  34. Session::instance()->set('cnd_controller',"");
  35. cnd::get("");
  36. }
  37. }



Еще наверное стоит добавить вот что.
Для того чтобы состояния отарабатывали верно, нужно вызов
cnd::get("");


поместить в конструктор базового для всех контроллеров контроллера.
Это позволит гарантировано при заходе в новый котроллер (а это фактически — выход из старого) сбрасывать все состояния не дефолтовые. Именно то что и требовалось. И любое установленное новое состояние будет хранится в сессии до первого выхода из контроллера.
Теги:Kohanaсостояния
Хабы: Kohana
Всего голосов 6: ↑4 и ↓2+2
Просмотры788
Комментарии Комментарии 9

Похожие публикации

Лучшие публикации за сутки