Mercurial > pub > Impl
comparison Lib/IMPL/Web/Application/ControllerUnit.pm @ 111:6c25ea91c985
ControllerUnit concept
| author | wizard |
|---|---|
| date | Tue, 18 May 2010 01:33:37 +0400 |
| parents | c13a215508ca |
| children | 0ed8e2541b1c |
comparison
equal
deleted
inserted
replaced
| 110:c13a215508ca | 111:6c25ea91c985 |
|---|---|
| 6 | 6 |
| 7 BEGIN { | 7 BEGIN { |
| 8 public property action => prop_get | owner_set; | 8 public property action => prop_get | owner_set; |
| 9 public property application => prop_get | owner_set; | 9 public property application => prop_get | owner_set; |
| 10 public property query => prop_get | owner_set; | 10 public property query => prop_get | owner_set; |
| 11 public property formData => prop_get | owner_set; | |
| 12 public property formSchema => prop_get | owner_set; | |
| 13 public property formErrors => prop_get | owner_set; | |
| 11 } | 14 } |
| 12 | 15 |
| 13 sub CTOR { | 16 sub CTOR { |
| 14 my ($this,$action) = @_; | 17 my ($this,$action) = @_; |
| 15 | 18 |
| 26 $unit->$method(); | 29 $unit->$method(); |
| 27 } else { | 30 } else { |
| 28 die new IMPL::InvalidOperationException("Invalid method call",$self,$method); | 31 die new IMPL::InvalidOperationException("Invalid method call",$self,$method); |
| 29 } | 32 } |
| 30 } | 33 } |
| 34 | |
| 35 1; | |
| 36 | |
| 37 __END__ | |
| 38 | |
| 39 =pod | |
| 40 | |
| 41 =head1 NAME | |
| 42 | |
| 43 C<IMPL::Web::Application::ControllerUnit> - базовый класс для обработчика транзакций в модели контроллера. | |
| 44 | |
| 45 =head1 DESCRIPTION | |
| 46 | |
| 47 Классы, наследуемые от данного класса используются для выполнения транзакций, которые приходят | |
| 48 через контроллер запросов. Как правило один класс представляет собой пакет транзакций, каждая | |
| 49 из которых является независимой от другой. | |
| 50 | |
| 51 Перед выполнением транзакции создается экземпляр объекта, в рамках которого будет выполнена транзакция. | |
| 52 Для этого вызывается метод C<InvokeAction($method,$action)>, который создает/восстанавливает контекст | |
| 53 транзакции. | |
| 54 | |
| 55 Транзакции на данный момент делятся на простые и формы. | |
| 56 | |
| 57 =head2 Простые транзакции | |
| 58 | |
| 59 Простые транзакции получаю только запрос, без предварительной обработки, и возвращенный результат напрямую | |
| 60 передается пользователю. | |
| 61 | |
| 62 =head2 Формы | |
| 63 | |
| 64 При использовании форм запрос предварительно обрабатывается, для получения DOM документа с данными формы. | |
| 65 Для постороенния DOM документа используется схема. При этом становятся доступны дополнительные свойства | |
| 66 C<formData>, C<formSchema>, C<formErrors>. | |
| 67 | |
| 68 Результат выполнения транзакции не возвращается напрямую пользователю, а включается в общий ответ, который | |
| 69 выглядит следующим образом | |
| 70 | |
| 71 =begin code | |
| 72 | |
| 73 { | |
| 74 state => '{ new | correct | invalid }', | |
| 75 result => $transactionResult, | |
| 76 formData => $formDOM, | |
| 77 formSchema => $formSchema, | |
| 78 formErrors => @errors | |
| 79 } | |
| 80 | |
| 81 =end code | |
| 82 | |
| 83 =over | |
| 84 | |
| 85 =item C<state> | |
| 86 | |
| 87 Состояние верификации формы. | |
| 88 | |
| 89 =over | |
| 90 | |
| 91 =item C<new> | |
| 92 | |
| 93 Первоначальное содержимое формы, оно может быть некорректным, но это нормально. | |
| 94 В данном состоянии транзакция обычно не выполняется. | |
| 95 | |
| 96 =item C<correct> | |
| 97 | |
| 98 Данные формы корректны, транзакция выполнена, и ее результат доступен через поле C<result> | |
| 99 | |
| 100 =item C<invalid> | |
| 101 | |
| 102 Содержимое формы не прошло верификацию, ошибки доступны через поле C<formErrors>. Транзакция | |
| 103 не выполнялась. | |
| 104 | |
| 105 =back | |
| 106 | |
| 107 =item C<result> | |
| 108 | |
| 109 Результат выполнения транзакции, если конечно таковая выполнялась. | |
| 110 | |
| 111 =item C<formData> | |
| 112 | |
| 113 ДОМ документ с данными формами. Документ существует всегда, не зависимо от его корректности, | |
| 114 может быть использован для построения формы, уже заполненную параметрами. | |
| 115 | |
| 116 =item C<formSchema> | |
| 117 | |
| 118 Схема данных формы, может использоваться для построения динамических форм. | |
| 119 | |
| 120 =item C<formErrors> | |
| 121 | |
| 122 Ошибки верификации данных, если таковые были | |
| 123 | |
| 124 =back | |
| 125 | |
| 126 =head1 MEMBERS | |
| 127 | |
| 128 =over | |
| 129 | |
| 130 =item C<[get] application> | |
| 131 | |
| 132 =item C<[get] query> | |
| 133 | |
| 134 =item C<[get] response> | |
| 135 | |
| 136 =item C<[get] formData> | |
| 137 | |
| 138 =item C<[get] formSchema> | |
| 139 | |
| 140 =item C<[get] formErrors> | |
| 141 | |
| 142 =item C<InvokeAction($method,$action)> | |
| 143 | |
| 144 Конструирует контекст выполнения транзакции, может быть переопределен для конструирования контекста по | |
| 145 своимправилам. | |
| 146 | |
| 147 =back | |
| 148 | |
| 149 =head1 EXAMPLE | |
| 150 | |
| 151 =begin code | |
| 152 | |
| 153 package MyBooksUnit; | |
| 154 use strict; | |
| 155 use base qw(IMPL::Web::Application::ControllerUnit); | |
| 156 | |
| 157 __PACKAGE__->PassThroughArgs; | |
| 158 | |
| 159 __PACKAGE__->transactions(qw( | |
| 160 find | |
| 161 info | |
| 162 )); | |
| 163 __PACKAGE__->forms( | |
| 164 create => 'books.create.xml' | |
| 165 ); | |
| 166 | |
| 167 sub find { | |
| 168 my ($this) = @_; | |
| 169 | |
| 170 return $this->application->dataSource->resultset('Books')->find({author => $this->query->param('author')}); | |
| 171 } | |
| 172 | |
| 173 sub info { | |
| 174 my ($this) = @_; | |
| 175 | |
| 176 return $this->application->dataSource->resultset('Books')->find({id => $this->query->param('id')}); | |
| 177 } | |
| 178 | |
| 179 sub create { | |
| 180 my ($this) = @_; | |
| 181 | |
| 182 my %book = map { | |
| 183 $_ => $this->formData->selectSingleNode($_)->nodeValue | |
| 184 } qw(author_id title year ISBN); | |
| 185 | |
| 186 return $this->application->datasource->resultset('Books')->create(\%book); | |
| 187 } | |
| 188 | |
| 189 =end code | |
| 190 | |
| 191 =cut |
