110
|
1 package IMPL::Web::Application::ControllerUnit;
|
|
2
|
|
3 use base qw(IMPL::Object);
|
|
4
|
|
5 use IMPL::Class::Property;
|
|
6
|
|
7 BEGIN {
|
|
8 public property action => prop_get | owner_set;
|
|
9 public property application => prop_get | owner_set;
|
|
10 public property query => prop_get | owner_set;
|
111
|
11 public property formData => prop_get | owner_set;
|
|
12 public property formSchema => prop_get | owner_set;
|
|
13 public property formErrors => prop_get | owner_set;
|
110
|
14 }
|
|
15
|
|
16 sub CTOR {
|
|
17 my ($this,$action) = @_;
|
|
18
|
|
19 $this->action($action);
|
|
20 $this->application($action->application);
|
|
21 $this->query($action->query);
|
|
22 }
|
|
23
|
|
24 sub InvokeAction {
|
|
25 my ($self,$method,$action) = @_;
|
|
26
|
|
27 if ($self->can($method)) {
|
|
28 my $unit = $self->new($action);
|
|
29 $unit->$method();
|
|
30 } else {
|
|
31 die new IMPL::InvalidOperationException("Invalid method call",$self,$method);
|
|
32 }
|
111
|
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 |