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