Mercurial > pub > Impl
changeset 111:6c25ea91c985
ControllerUnit concept
author | wizard |
---|---|
date | Tue, 18 May 2010 01:33:37 +0400 |
parents | c13a215508ca |
children | 0ed8e2541b1c |
files | Lib/IMPL/Class/Meta.pm Lib/IMPL/Web/Application/ControllerUnit.pm |
diffstat | 2 files changed, 163 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/IMPL/Class/Meta.pm Mon May 17 17:42:27 2010 +0400 +++ b/Lib/IMPL/Class/Meta.pm Tue May 18 01:33:37 2010 +0400 @@ -200,7 +200,7 @@ sub say_version { my ($self) = @_; - print $self->class_data(info)->{version}; + print $self->class_data('info')->{version}; } package Bar;
--- a/Lib/IMPL/Web/Application/ControllerUnit.pm Mon May 17 17:42:27 2010 +0400 +++ b/Lib/IMPL/Web/Application/ControllerUnit.pm Tue May 18 01:33:37 2010 +0400 @@ -8,6 +8,9 @@ public property action => prop_get | owner_set; public property application => prop_get | owner_set; public property query => prop_get | owner_set; + public property formData => prop_get | owner_set; + public property formSchema => prop_get | owner_set; + public property formErrors => prop_get | owner_set; } sub CTOR { @@ -27,4 +30,162 @@ } else { die new IMPL::InvalidOperationException("Invalid method call",$self,$method); } -} \ No newline at end of file +} + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::Web::Application::ControllerUnit> - базовый класс для обработчика транзакций в модели контроллера. + +=head1 DESCRIPTION + +Классы, наследуемые от данного класса используются для выполнения транзакций, которые приходят +через контроллер запросов. Как правило один класс представляет собой пакет транзакций, каждая +из которых является независимой от другой. + +Перед выполнением транзакции создается экземпляр объекта, в рамках которого будет выполнена транзакция. +Для этого вызывается метод C<InvokeAction($method,$action)>, который создает/восстанавливает контекст +транзакции. + +Транзакции на данный момент делятся на простые и формы. + +=head2 Простые транзакции + +Простые транзакции получаю только запрос, без предварительной обработки, и возвращенный результат напрямую +передается пользователю. + +=head2 Формы + +При использовании форм запрос предварительно обрабатывается, для получения DOM документа с данными формы. +Для постороенния DOM документа используется схема. При этом становятся доступны дополнительные свойства +C<formData>, C<formSchema>, C<formErrors>. + +Результат выполнения транзакции не возвращается напрямую пользователю, а включается в общий ответ, который +выглядит следующим образом + +=begin code + +{ + state => '{ new | correct | invalid }', + result => $transactionResult, + formData => $formDOM, + formSchema => $formSchema, + formErrors => @errors +} + +=end code + +=over + +=item C<state> + +Состояние верификации формы. + +=over + +=item C<new> + +Первоначальное содержимое формы, оно может быть некорректным, но это нормально. +В данном состоянии транзакция обычно не выполняется. + +=item C<correct> + +Данные формы корректны, транзакция выполнена, и ее результат доступен через поле C<result> + +=item C<invalid> + +Содержимое формы не прошло верификацию, ошибки доступны через поле C<formErrors>. Транзакция +не выполнялась. + +=back + +=item C<result> + +Результат выполнения транзакции, если конечно таковая выполнялась. + +=item C<formData> + +ДОМ документ с данными формами. Документ существует всегда, не зависимо от его корректности, +может быть использован для построения формы, уже заполненную параметрами. + +=item C<formSchema> + +Схема данных формы, может использоваться для построения динамических форм. + +=item C<formErrors> + +Ошибки верификации данных, если таковые были + +=back + +=head1 MEMBERS + +=over + +=item C<[get] application> + +=item C<[get] query> + +=item C<[get] response> + +=item C<[get] formData> + +=item C<[get] formSchema> + +=item C<[get] formErrors> + +=item C<InvokeAction($method,$action)> + +Конструирует контекст выполнения транзакции, может быть переопределен для конструирования контекста по +своимправилам. + +=back + +=head1 EXAMPLE + +=begin code + +package MyBooksUnit; +use strict; +use base qw(IMPL::Web::Application::ControllerUnit); + +__PACKAGE__->PassThroughArgs; + +__PACKAGE__->transactions(qw( + find + info +)); +__PACKAGE__->forms( + create => 'books.create.xml' +); + +sub find { + my ($this) = @_; + + return $this->application->dataSource->resultset('Books')->find({author => $this->query->param('author')}); +} + +sub info { + my ($this) = @_; + + return $this->application->dataSource->resultset('Books')->find({id => $this->query->param('id')}); +} + +sub create { + my ($this) = @_; + + my %book = map { + $_ => $this->formData->selectSingleNode($_)->nodeValue + } qw(author_id title year ISBN); + + return $this->application->datasource->resultset('Books')->create(\%book); +} + +=end code + +=cut \ No newline at end of file