Pull to refresh

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

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

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

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


  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("");


поместить в конструктор базового для всех контроллеров контроллера.
Это позволит гарантировано при заходе в новый котроллер (а это фактически — выход из старого) сбрасывать все состояния не дефолтовые. Именно то что и требовалось. И любое установленное новое состояние будет хранится в сессии до первого выхода из контроллера.
Tags:
Hubs:
Total votes 6: ↑4 and ↓2+2
Comments9

Articles