parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Гуру объектной модели и устройства Парсера, подскажите астронавту архитектуры, что я сделал и почему это работает.

andylars 14.04.2016 14:08 / 14.04.2016 14:10

Сразу скажу - всё работает. Но пугает! :)
Хочу комментариев что на самом деле происходит и не выстрелю ли я себе в ногу?
Не совсем понимаю, в этом хитросплетении объектов и замыканий, что на самом деле происходит или может произойти.

Итак, имею в базовой модели примерно такую вложенность объектов/классов.
код примерный и упрощен для умозрительности


Есть общий мета-класс WebApp, от которого из MAIN создается объект-"клиентская сессия":
WebApp имеет на втором уровне вложенности 3 подкласса: 
  Environ (управляет и причесывает окружение, по сути Front-Controller)
  Model (она же модель приложения, API, логика)
  Controller (разруливает состояние окружения и общается с моделью, вызывая шаблоны и отдавая рендер страниц)
    Template (класс-шаблонизатор)
Возникают такие моменты, когда состояние, которое уже построено выше (окружением) надо перестроить, например на поздней стадии инициалиазии или работы контроллера, возникло понимание, что надо авторизовать и записать сессионную куку, однако стадия прочитки сессии уже миновала выше, по этой причине часто можно видеть, как сайт тупо делает внешний редирект или рефреш, после входа, чтобы по сути решить свои внутренние проблемы - по прочитке сессионной куки (которая на самом деле уже доступна внутри).

Чтобы не делать лишних редиректов (да и вообще), я как раз в рамках внутреннего "клиентского соединения" - хочу либо подать сигнал пересоздать весь объект-приложение,
либо реинициализировать (пересоздать) один из подвложенных объектов (например только Environ).
@main[]
   $trigger(0)    ^rem{# <-- это для дебаг-эксперимента}

   $MySession[^WebApp::create[
      $.Proto[http]
      $.Environment[internal]
   ]]
   ^MySession.render[]


@CLASS
WebApp

@create[_param][locals]
   $self.WebApp[$self]

@render[][locals]
   $self.InitParams[$self._params]
   $self.Environ[^Environ::create[$self.WebApp]]
   $self.Controller[^Controller::create[$self.WebApp]]
   $self.Model[^Model::create[$self.Model]]
   ^self.Controller.render_page[]



@CLASS
Environ

@create[_parent][locals]
   $self.WebApp[$_parent]

   ^if($self.WebApp.InitParams.Proto eq 'http'){ ...blah-blah }

   $self.Data[
      $Raw[http data blah-blah]
      $Struc[
         $.Sess[^if($cookie:sess is hash){$cookie:sess.value}{$cookie:sess}]
         $.Action[login]
      ]
   ]



@CLASS
Model

@create[_parent][locals]
   $self.WebApp[$_parent]


@auth_sess[_sess][locals]
$result($_sess eq '12345')


@someapi_method[][locals]
# ...





@CLASS
Controller

@create[_parent][locals]
   $self.WebApp[$_parent]
   $self.Template[^Template::create[]]

@render_page[][locals]
#  reading and doing something with
#  environment data

^if(^self.WebApp.Model.AuthSess[$self.WebApp.Environ.Data.Struc.Sess]]){
  $Template.TopBar.Status[вы авторизованы]
}

#... some procedures 

# --------- И ВОТ ТУТ ВАЖНЫЙ МОМЕНТ ----------------
# сессию мы уже прочитали, и допустим она не соответствует залогиненому пользователю
# но ниже у наш пришёл Action - на вход, где мы авторизуем, ставим сессионую куку

^if($self.WebApp.Environ.Data.Struc.Action eq 'login'){
   $cookie:sess[12345]
}

# но вместо "доброй традиции" отправлять на внешний редирект, мы ре-рендерим всё внутри (по сути внутренний редирект на уровне приложения, а не апача или http)
# подкостыливаем в рамках примера, чтобы не зациклилось

^if($MAIN:trigger == 0){
   $self.WebApp.render[]
}

$MAIN:trigger(1)
Вопрос:

Не вполне понятно, что происходит, ведь я методом WebApp.render[] пересоздаю заново вложенные в него объекты $Environ,$Controller,$Model, и делаю это изнутри одного из этих вложенных объектов: а именно из $Controller.

Скорее меня интересует/беспокоит, чтобы старые экземпляры $Environ,$Controller,$Model - перестали существовать или доступ к ним был гарантировано потерян.

Просто когда я вызываю метод родительского объекта, который пересоздает свои вложенные объекты,
то интуитивно пугает, что следующий за этим вызовом, код ниже => $MAIN:trigger(1) - вполне себе выполняется.

На каком этапе прошлые экземпляры $Controller,$Environ,$Model - умрут?
После окончания метода ^Controller.render_page[] ?

Или что происходит вообще?
Спасибо.