Mercurial > pub > Impl
comparison Lib/IMPL/Web/Application/Action.pm @ 67:9f5795a10939
Documentation, minor fixes
| author | wizard |
|---|---|
| date | Fri, 19 Mar 2010 20:06:12 +0300 |
| parents | 2840c4c85db8 |
| children | b56ebc31bf18 |
comparison
equal
deleted
inserted
replaced
| 66:f47f93534005 | 67:9f5795a10939 |
|---|---|
| 85 | 85 |
| 86 __END__ | 86 __END__ |
| 87 | 87 |
| 88 =pod | 88 =pod |
| 89 | 89 |
| 90 =head1 NAME | |
| 91 | |
| 92 C<IMPL::Web::Application::Action> - Обертка вокруг C<CGI> запроса. | |
| 93 | |
| 90 =head1 DESCRIPTION | 94 =head1 DESCRIPTION |
| 91 | 95 |
| 92 Определяет порядок выполнения запроса. | 96 C<[Infrastructure]> |
| 93 | 97 |
| 94 Запрос выполняется последовательным вызовом цепочки обработчиков, при этом обработчики | 98 Определяет порядок выполнения запроса. Запрос выполняется последовательным вызовом |
| 95 сами вызывают следующие. | 99 цепочки обработчиков, при этом обработчики сами вызывают следующие. |
| 100 Обработчики выполняются в порядке, обратном их добавлению. | |
| 96 | 101 |
| 97 Типичная цепочка может быть такой, в порядке добавления | 102 Типичная цепочка может быть такой, в порядке добавления |
| 98 | 103 |
| 99 SecCallToMethod($target,$method) | 104 =begin code |
| 100 AuthenticateMethod | 105 |
| 101 TDocumentOut($file) | 106 IMPL::Web::QueryHandler::SecCallToMethod |
| 107 IMPL::Web::QueryHandler::AuthenticateCookie | |
| 108 IMPL::Web::QueryHandler::PageFormat | |
| 109 | |
| 110 =end code | |
| 102 | 111 |
| 103 что приведет к следующей последовательности | 112 что приведет к следующей последовательности |
| 104 | 113 |
| 105 Action->Invoke() { | 114 =begin code |
| 106 TDocumentOut->Invoke($Action,$nextHandler) { | 115 |
| 107 my $result = $nextHandler() { | 116 # the application creates a new Action object |
| 108 $AuthenticateMethod($Action,$nextHandler) { | 117 |
| 109 my $context = $Action->application->security->Authenticate($Action->query,$Action->response); | 118 my $action = $application->actionFactory->new( |
| 110 return $context->Impersonate($nextHandler) { | 119 action => $application, # the application passes self |
| 111 $objSecCallToMethod->Invoke($Action,undef) { | 120 query => $query # current CGI query |
| 121 ); | |
| 122 | |
| 123 # forms query handlers stack | |
| 124 | |
| 125 $action->ChainHandler($_) foreach qw ( | |
| 126 IMPL::Web::QueryHandler::SecCallToMethod | |
| 127 IMPL::Web::QueryHandler::AuthenticateCookie | |
| 128 IMPL::Web::QueryHandler::PageFormat | |
| 129 ); | |
| 130 | |
| 131 # and finally invokes the action | |
| 132 | |
| 133 $action->Invoke() { | |
| 134 | |
| 135 # some internals | |
| 136 | |
| 137 IMPL::Web::QueryHandler::PageFormat->Invoke($action,$nextHandlerIsAuthHandler) { | |
| 138 | |
| 139 #some internals | |
| 140 | |
| 141 my $result = $nextHandlerIsAuthHandler() { | |
| 142 | |
| 143 # some internals | |
| 144 | |
| 145 IMPL::Web::QueryHandler::AuthenticateCookie->Invoke($action,$nextHandlerIsSecCall) { | |
| 146 | |
| 147 # some internals | |
| 148 # do auth and generate security $context | |
| 149 | |
| 150 # impersonate $context and call the next handler | |
| 151 return $context->Impersonate($nextHandlerIsSecCall) { | |
| 152 | |
| 153 # some internals | |
| 154 | |
| 155 IMPL::Web::QueryHandler::SecCallToMethod->Invoke($action,undef) { | |
| 156 | |
| 157 # next handler isn't present as it is the last hanler | |
| 158 | |
| 159 # some internals | |
| 160 # calculate the $method and the $target from CGI request | |
| 161 | |
| 112 IMPL::Security->AccessCheck($target,$method); | 162 IMPL::Security->AccessCheck($target,$method); |
| 113 return $target->$method(); | 163 return $target->$method(); |
| 164 | |
| 114 } | 165 } |
| 166 | |
| 115 } | 167 } |
| 168 | |
| 116 } | 169 } |
| 117 } | 170 } |
| 118 $this->format($result,$Action->response->streamBody); | 171 |
| 172 # some intenals | |
| 173 # formatted output to $action->response->streamBody | |
| 119 } | 174 } |
| 120 } | 175 } |
| 121 | 176 |
| 177 =end code | |
| 178 | |
| 122 или как альтернатива может быть еще | 179 или как альтернатива может быть еще |
| 123 | 180 |
| 124 $objSecCallToMethod($target,$method) | 181 =begin code |
| 125 $AuthenticateMethod | 182 |
| 126 $TransfromToSimpleData | 183 IMPL::Web::QueryHandler::SecCallToMethod |
| 127 $JSONOut | 184 IMPL::Web::QueryHandler::AuthenticateCookie |
| 185 IMPL::Web::QueryHandler::Filter->new( target => IMPL::Transform::ObjectToJSON->new() , method => 'Transform') | |
| 186 IMLP::Web::QueryHandler::JSONFormat | |
| 187 | |
| 188 | |
| 189 =end code | |
| 128 | 190 |
| 129 В данной цепочке также происходит вызов метода, но его результат потом преобразуется | 191 В данной цепочке также происходит вызов метода, но его результат потом преобразуется |
| 130 в простые структуры и передается JSON преобразователю. Таким образом модулю логики | 192 в простые структуры и передается JSON преобразователю. Таким образом модулю логики |
| 131 не требуется знать о выходном формате, всю работу проделают дополнительные фильтры. | 193 не требуется знать о выходном формате, всю работу проделают дополнительные фильтры. |
| 132 | 194 |
| 195 =head1 MEMBERS | |
| 196 | |
| 197 =head2 PROPERTIES | |
| 198 | |
| 199 =over | |
| 200 | |
| 201 =item C< [get] application> | |
| 202 | |
| 203 Экземпляр приложения создавшего текущий объект | |
| 204 | |
| 205 =item C< [get] query > | |
| 206 | |
| 207 Экземпляр C<CGI> запроса | |
| 208 | |
| 209 =item C< [get] response > | |
| 210 | |
| 211 Ответ на C<CGI> заспрос C<IMPL::Web::Application::Response> | |
| 212 | |
| 213 =item C< [get] responseFactory > | |
| 214 | |
| 215 Фабрика ответов на запрос, используется для создания нового ответа | |
| 216 либо при конструировании текущего объекта C<IMPL::Web::Application::Action>, | |
| 217 либо при вызове метода C<ReinitResponse> у текущего объекта. | |
| 218 | |
| 219 По умолчанию имеет значение C<IMPL::Web::Application::Response> | |
| 220 | |
| 221 =back | |
| 222 | |
| 223 =head2 METHODS | |
| 224 | |
| 225 =over | |
| 226 | |
| 227 =item C< ReinitResponse() > | |
| 228 | |
| 229 Отмена старого ответа C<response> и создание вместо него нового. | |
| 230 | |
| 231 Данная операция обычно проводится при обработке ошибок, когда | |
| 232 уже сформированный ответ требуется отменить. Следует заметить, | |
| 233 что эта операция не возможна, если ответ частично или полностью | |
| 234 отправлен клиенту. Тогда возникает исключение C<IMPL::InvalidOperationException>. | |
| 235 | |
| 236 =item C< ChainHandler($handler) > | |
| 237 | |
| 238 Добавляет новый обработчик в цепочку. Выполнение цепочки начинается с конца, | |
| 239 тоесть последний добавленный будет выполнен первым. | |
| 240 | |
| 241 =back | |
| 242 | |
| 133 =head1 HANDLERS | 243 =head1 HANDLERS |
| 134 | 244 |
| 135 =head2 subroutines | 245 =head2 subroutines |
| 136 | 246 |
| 137 =over | 247 =over |
| 149 | 259 |
| 150 Получается вызов идентичный следующему C<< $action->MethodName($nextHandler) >>; | 260 Получается вызов идентичный следующему C<< $action->MethodName($nextHandler) >>; |
| 151 | 261 |
| 152 =back | 262 =back |
| 153 | 263 |
| 154 =head2 C< IMPL::Web::Application::QueryHandler > | 264 =head2 C< IMPL::Web::QueryHandler > |
| 155 | 265 |
| 156 Любой объект наследованный от C< IMPL::Web::Application::QueryHandler > может быть | 266 Любой объект наследованный от C< IMPL::Web::QueryHandler > может быть |
| 157 использован в качестве обработчика запроса | 267 использован в качестве обработчика запроса |
| 158 | 268 |
| 159 =cut | 269 =cut |
