Mercurial > pub > Impl
diff 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 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/Application/Action.pm Thu Mar 18 17:58:33 2010 +0300 +++ b/Lib/IMPL/Web/Application/Action.pm Fri Mar 19 20:06:12 2010 +0300 @@ -87,49 +87,159 @@ =pod +=head1 NAME + +C<IMPL::Web::Application::Action> - Обертка вокруг C<CGI> запроса. + =head1 DESCRIPTION -Определяет порядок выполнения запроса. +C<[Infrastructure]> -Запрос выполняется последовательным вызовом цепочки обработчиков, при этом обработчики -сами вызывают следующие. +Определяет порядок выполнения запроса. Запрос выполняется последовательным вызовом +цепочки обработчиков, при этом обработчики сами вызывают следующие. +Обработчики выполняются в порядке, обратном их добавлению. Типичная цепочка может быть такой, в порядке добавления -SecCallToMethod($target,$method) -AuthenticateMethod -TDocumentOut($file) +=begin code + +IMPL::Web::QueryHandler::SecCallToMethod +IMPL::Web::QueryHandler::AuthenticateCookie +IMPL::Web::QueryHandler::PageFormat + +=end code что приведет к следующей последовательности -Action->Invoke() { - TDocumentOut->Invoke($Action,$nextHandler) { - my $result = $nextHandler() { - $AuthenticateMethod($Action,$nextHandler) { - my $context = $Action->application->security->Authenticate($Action->query,$Action->response); - return $context->Impersonate($nextHandler) { - $objSecCallToMethod->Invoke($Action,undef) { +=begin code + +# the application creates a new Action object + +my $action = $application->actionFactory->new( + action => $application, # the application passes self + query => $query # current CGI query +); + +# forms query handlers stack + +$action->ChainHandler($_) foreach qw ( + IMPL::Web::QueryHandler::SecCallToMethod + IMPL::Web::QueryHandler::AuthenticateCookie + IMPL::Web::QueryHandler::PageFormat +); + +# and finally invokes the action + +$action->Invoke() { + + # some internals + + IMPL::Web::QueryHandler::PageFormat->Invoke($action,$nextHandlerIsAuthHandler) { + + #some internals + + my $result = $nextHandlerIsAuthHandler() { + + # some internals + + IMPL::Web::QueryHandler::AuthenticateCookie->Invoke($action,$nextHandlerIsSecCall) { + + # some internals + # do auth and generate security $context + + # impersonate $context and call the next handler + return $context->Impersonate($nextHandlerIsSecCall) { + + # some internals + + IMPL::Web::QueryHandler::SecCallToMethod->Invoke($action,undef) { + + # next handler isn't present as it is the last hanler + + # some internals + # calculate the $method and the $target from CGI request + IMPL::Security->AccessCheck($target,$method); return $target->$method(); + } + } + } } - $this->format($result,$Action->response->streamBody); + + # some intenals + # formatted output to $action->response->streamBody } } +=end code + или как альтернатива может быть еще -$objSecCallToMethod($target,$method) -$AuthenticateMethod -$TransfromToSimpleData -$JSONOut +=begin code + +IMPL::Web::QueryHandler::SecCallToMethod +IMPL::Web::QueryHandler::AuthenticateCookie +IMPL::Web::QueryHandler::Filter->new( target => IMPL::Transform::ObjectToJSON->new() , method => 'Transform') +IMLP::Web::QueryHandler::JSONFormat + + +=end code В данной цепочке также происходит вызов метода, но его результат потом преобразуется в простые структуры и передается JSON преобразователю. Таким образом модулю логики не требуется знать о выходном формате, всю работу проделают дополнительные фильтры. +=head1 MEMBERS + +=head2 PROPERTIES + +=over + +=item C< [get] application> + +Экземпляр приложения создавшего текущий объект + +=item C< [get] query > + +Экземпляр C<CGI> запроса + +=item C< [get] response > + +Ответ на C<CGI> заспрос C<IMPL::Web::Application::Response> + +=item C< [get] responseFactory > + +Фабрика ответов на запрос, используется для создания нового ответа +либо при конструировании текущего объекта C<IMPL::Web::Application::Action>, +либо при вызове метода C<ReinitResponse> у текущего объекта. + +По умолчанию имеет значение C<IMPL::Web::Application::Response> + +=back + +=head2 METHODS + +=over + +=item C< ReinitResponse() > + +Отмена старого ответа C<response> и создание вместо него нового. + +Данная операция обычно проводится при обработке ошибок, когда +уже сформированный ответ требуется отменить. Следует заметить, +что эта операция не возможна, если ответ частично или полностью +отправлен клиенту. Тогда возникает исключение C<IMPL::InvalidOperationException>. + +=item C< ChainHandler($handler) > + +Добавляет новый обработчик в цепочку. Выполнение цепочки начинается с конца, +тоесть последний добавленный будет выполнен первым. + +=back + =head1 HANDLERS =head2 subroutines @@ -151,9 +261,9 @@ =back -=head2 C< IMPL::Web::Application::QueryHandler > +=head2 C< IMPL::Web::QueryHandler > -Любой объект наследованный от C< IMPL::Web::Application::QueryHandler > может быть +Любой объект наследованный от C< IMPL::Web::QueryHandler > может быть использован в качестве обработчика запроса =cut \ No newline at end of file