Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
andylars 14.04.2016 14:08 / 14.04.2016 14:10
Сразу скажу - всё работает. Но пугает! :)WebApp имеет на втором уровне вложенности 3 подкласса: Environ (управляет и причесывает окружение, по сути Front-Controller) Model (она же модель приложения, API, логика) Controller (разруливает состояние окружения и общается с моделью, вызывая шаблоны и отдавая рендер страниц) Template (класс-шаблонизатор)Возникают такие моменты, когда состояние, которое уже построено выше (окружением) надо перестроить, например на поздней стадии инициалиазии или работы контроллера, возникло понимание, что надо авторизовать и записать сессионную куку, однако стадия прочитки сессии уже миновала выше, по этой причине часто можно видеть, как сайт тупо делает внешний редирект или рефреш, после входа, чтобы по сути решить свои внутренние проблемы - по прочитке сессионной куки (которая на самом деле уже доступна внутри).
@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)Вопрос: