comparison Lib/IMPL/Web/Application/Action.pm @ 206:c8fe3f84feba

+IMPL::Web::Handlers::ViewSelector +IMPL::Web::Handlers::ErrorHandler *IMPL::Web::Handlers::RestController moved types mappings to ViewSelector
author sergey
date Thu, 03 May 2012 16:48:39 +0400
parents 4d0e1962161c
children 47f77e6409f7
comparison
equal deleted inserted replaced
205:891c04080658 206:c8fe3f84feba
4 use parent qw(IMPL::Object IMPL::Object::Autofill); 4 use parent qw(IMPL::Object IMPL::Object::Autofill);
5 5
6 __PACKAGE__->PassThroughArgs; 6 __PACKAGE__->PassThroughArgs;
7 7
8 use IMPL::Class::Property; 8 use IMPL::Class::Property;
9 use Carp qw(carp);
9 10
10 BEGIN { 11 BEGIN {
11 public property application => prop_get | owner_set; 12 public property application => prop_get | owner_set;
12 public property query => prop_get | owner_set; 13 public property query => prop_get | owner_set;
13 public property response => prop_get | owner_set; 14 public property response => prop_get | owner_set;
43 $this->response($this->responseFactory->new(query => $this->query)); 44 $this->response($this->responseFactory->new(query => $this->query));
44 } 45 }
45 46
46 sub ChainHandler { 47 sub ChainHandler {
47 my ($this,$handler) = @_; 48 my ($this,$handler) = @_;
49
50 carp "deprecated, use Application->handlers instead";
48 51
49 my $delegateNext = $this->_entryPoint(); 52 my $delegateNext = $this->_entryPoint();
50 53
51 if (ref $handler eq 'CODE') { 54 if (ref $handler eq 'CODE') {
52 $this->_entryPoint( sub { 55 $this->_entryPoint( sub {
123 C<IMPL::Web::Application::Action> - Обертка вокруг C<CGI> запроса. 126 C<IMPL::Web::Application::Action> - Обертка вокруг C<CGI> запроса.
124 127
125 =head1 DESCRIPTION 128 =head1 DESCRIPTION
126 129
127 C<[Infrastructure]> 130 C<[Infrastructure]>
128 131 Свзяывет CGI запрос, приложение, орабатывающее его и ответ, который будет отправлен клиенту.
129 Определяет порядок выполнения запроса. Запрос выполняется последовательным вызовом
130 цепочки обработчиков, при этом обработчики сами вызывают следующие.
131 Обработчики выполняются в порядке, обратном их добавлению.
132
133 Типичная цепочка может быть такой, в порядке добавления
134
135 =begin code
136
137 IMPL::Web::QueryHandler::SecCallToMethod
138 IMPL::Web::QueryHandler::AuthenticateCookie
139 IMPL::Web::QueryHandler::PageFormat
140
141 =end code
142
143 что приведет к следующей последовательности
144
145 =begin code
146
147 # the application creates a new Action object
148
149 my $action = $application->actionFactory->new(
150 action => $application, # the application passes self
151 query => $query # current CGI query
152 );
153
154 # forms query handlers stack
155
156 $action->ChainHandler($_) foreach qw (
157 IMPL::Web::QueryHandler::SecCallToMethod
158 IMPL::Web::QueryHandler::AuthenticateCookie
159 IMPL::Web::QueryHandler::PageFormat
160 );
161
162 # and finally invokes the action
163
164 $action->Invoke() {
165
166 # some internals
167
168 IMPL::Web::QueryHandler::PageFormat->Invoke($action,$nextHandlerIsAuthHandler) {
169
170 #some internals
171
172 my $result = $nextHandlerIsAuthHandler() {
173
174 # some internals
175
176 IMPL::Web::QueryHandler::AuthenticateCookie->Invoke($action,$nextHandlerIsSecCall) {
177
178 # some internals
179 # do auth and generate security $context
180
181 # impersonate $context and call the next handler
182 return $context->Impersonate($nextHandlerIsSecCall) {
183
184 # some internals
185
186 IMPL::Web::QueryHandler::SecCallToMethod->Invoke($action,undef) {
187
188 # next handler isn't present as it is the last hanler
189
190 # some internals
191 # calculate the $method and the $target from CGI request
192
193 IMPL::Security->AccessCheck($target,$method);
194 return $target->$method();
195
196 }
197
198 }
199
200 }
201 }
202
203 # some intenals
204 # formatted output to $action->response->streamBody
205 }
206 }
207
208 =end code
209
210 или как альтернатива может быть еще
211
212 =begin code
213
214 IMPL::Web::QueryHandler::SecCallToMethod
215 IMPL::Web::QueryHandler::AuthenticateCookie
216 IMPL::Web::QueryHandler::Filter->new( target => IMPL::Transform::ObjectToJSON->new() , method => 'Transform')
217 IMLP::Web::QueryHandler::JSONFormat
218
219
220 =end code
221
222 В данной цепочке также происходит вызов метода, но его результат потом преобразуется
223 в простые структуры и передается JSON преобразователю. Таким образом модулю логики
224 не требуется знать о выходном формате, всю работу проделают дополнительные фильтры.
225 132
226 =head1 MEMBERS 133 =head1 MEMBERS
227 134
228 =head2 PROPERTIES 135 =head2 PROPERTIES
229 136
262 Данная операция обычно проводится при обработке ошибок, когда 169 Данная операция обычно проводится при обработке ошибок, когда
263 уже сформированный ответ требуется отменить. Следует заметить, 170 уже сформированный ответ требуется отменить. Следует заметить,
264 что эта операция не возможна, если ответ частично или полностью 171 что эта операция не возможна, если ответ частично или полностью
265 отправлен клиенту. Тогда возникает исключение C<IMPL::InvalidOperationException>. 172 отправлен клиенту. Тогда возникает исключение C<IMPL::InvalidOperationException>.
266 173
267 =item C< ChainHandler($handler) >
268
269 Добавляет новый обработчик в цепочку. Выполнение цепочки начинается с конца,
270 тоесть последний добавленный будет выполнен первым.
271
272 =back
273
274 =head1 HANDLERS
275
276 =head2 subroutines
277
278 =over
279
280 =item CODE ref
281
282 Ссылка на процедуру может являться обработчиком, при этом функция будет вызвана с
283 двумя параметрами: ссылкой на action объект, и точкой входа следующего обработчика.
284
285 =item Method Name
286
287 Имя метода, передается в виде строки. У текущего объекта action ищется метод с
288 указанным именем, после чего используется ссылка на этот метод для вызова с двумя
289 параметрами: ссылкой на action объект, и точкой входа следующего обработчика.
290
291 Получается вызов идентичный следующему C<< $action->MethodName($nextHandler) >>;
292
293 =back
294
295 =head2 C< IMPL::Web::QueryHandler >
296
297 Любой объект наследованный от C< IMPL::Web::QueryHandler > может быть
298 использован в качестве обработчика запроса
299
300 =cut 174 =cut