Mercurial > pub > Impl
annotate Lib/IMPL/Web/Application.pm @ 85:190c794a41ae
DateTime renamed because of collision
author | wizard |
---|---|
date | Fri, 16 Apr 2010 16:33:11 +0400 |
parents | 2f31ecabe9ea |
children | 964587c5183c |
rev | line source |
---|---|
49 | 1 package IMPL::Web::Application; |
2 use strict; | |
3 use warnings; | |
4 | |
60
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
5 use base qw(IMPL::Config IMPL::Object::Singleton); |
58 | 6 |
7 require IMPL::Web::Application::Action; | |
8 require IMPL::Web::Application::Response; | |
9 | |
49 | 10 use IMPL::Class::Property; |
57 | 11 use CGI; |
49 | 12 |
60
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
13 __PACKAGE__->PassThroughArgs; |
b0c068da93ac
Lazy activation for the configuration objects (final concept)
wizard
parents:
59
diff
changeset
|
14 |
49 | 15 BEGIN { |
52 | 16 public property handlerError => prop_all; |
67 | 17 public property actionFactory => prop_all; |
59
0f3e369553bd
Rewritten property implementation (probably become slower but more flexible)
wizard
parents:
58
diff
changeset
|
18 public property handlersQuery => prop_all | prop_list; |
65 | 19 public property responseCharset => prop_all; |
73 | 20 public property security => prop_all; |
63
76b878ad6596
Added serialization support for the IMPL::Object::List
wizard
parents:
62
diff
changeset
|
21 public property options => prop_all; |
49 | 22 } |
23 | |
62 | 24 sub CTOR { |
25 my ($this) = @_; | |
26 | |
67 | 27 $this->actionFactory('IMPL::Web::Application::Action') unless $this->actionFactory; |
65 | 28 $this->responseCharset('utf-8') unless $this->responseCharset; |
62 | 29 } |
30 | |
49 | 31 sub Run { |
32 my ($this) = @_; | |
33 | |
58 | 34 while (my $query = $this->FetchRequest()) { |
35 | |
67 | 36 my $action = $this->actionFactory->new( |
62 | 37 query => $query, |
58 | 38 application => $this, |
65 | 39 ); |
40 | |
41 $action->response->charset($this->responseCharset); | |
58 | 42 |
43 $action->ChainHandler($_) foreach $this->handlersQuery; | |
44 | |
45 $action->Invoke(); | |
63
76b878ad6596
Added serialization support for the IMPL::Object::List
wizard
parents:
62
diff
changeset
|
46 |
76b878ad6596
Added serialization support for the IMPL::Object::List
wizard
parents:
62
diff
changeset
|
47 $action->response->Complete; |
49 | 48 } |
49 } | |
50 | |
57 | 51 { |
52 my $hasFetched = 0; | |
53 | |
54 sub FetchRequest { | |
55 return undef if $hasFetched; | |
56 $hasFetched = 1; | |
57 return CGI->new(); | |
58 } | |
59 } | |
60 | |
49 | 61 1; |
62 | |
52 | 63 __END__ |
64 | |
49 | 65 =pod |
66 | |
67 =head1 SYNOPSIS | |
68 | |
67 | 69 =begin code |
70 | |
49 | 71 require MyApp; |
67 | 72 |
73 my $instance = spawn MyApp('app.config'); | |
74 | |
75 $instance->Run(); | |
76 | |
77 =end code | |
49 | 78 |
79 =head1 DESCRIPTION | |
80 | |
73 | 81 C< use base qw( IMPL::Config IMPL::Object::Singleton )> |
82 | |
49 | 83 Зкземпляр приложения содержит в себе глобальные настройки, реализует контроллер запросов, |
52 | 84 в качестве источника запросов используется CGI или иной совместимый модуль. |
49 | 85 |
52 | 86 Процесс обработки запроса состоит из следующих частей |
49 | 87 |
67 | 88 =over |
89 | |
90 =item 1 | |
91 | |
92 Получение cgi запроса | |
93 | |
94 =item 2 | |
52 | 95 |
67 | 96 Создание объекта C<IMPL::Web::Application::Action> |
52 | 97 |
67 | 98 =item 3 |
52 | 99 |
67 | 100 Формирование цепочки вызовов при помощи C<< IMPL::Web::Application::Action->ChainHandler >> |
101 | |
102 =item 4 | |
103 | |
104 Выполнение запроса C<< IMPL::Web::Application::Action->Invoke >> | |
49 | 105 |
106 =cut | |
67 | 107 |
108 Также приложение поддерживает отложенное создание объектов, которые по первому обращению | |
109 к свойствам. Это реализовано в базовом классе C< IMPL::Configuration >. Для настройки | |
110 активаторов можно использовать свойство C<options>, в которое должен быть помещен хеш | |
111 со ссылками на активаторы, см. пример ниже C<CONFIGURATION>. | |
112 | |
113 =head2 CONFIGURATION | |
114 | |
115 Ниже приведен пример конфигурации приложения | |
116 | |
117 =begin code xml | |
118 | |
119 <?xml version="1.0" encoding="UTF-8"?> | |
120 <Application id='app' type="Test::Web::Application::Instance"> | |
121 | |
122 <!-- Begin custom properties --> | |
123 <name>Sample application</name> | |
124 <dataSource type='IMPL::Config::Activator' id='ds'> | |
125 <factory>IMPL::Object</factory> | |
126 <parameters type='HASH'> | |
127 <db>data</db> | |
128 <user>nobody</user> | |
129 </parameters> | |
130 </dataSource> | |
131 <securityMod type='IMPL::Config::Activator'> | |
132 <factory>IMPL::Object</factory> | |
133 <parameters type='HASH'> | |
134 <ds refid='ds'/> | |
135 </parameters> | |
136 </securityMod> | |
137 <!-- End custom properties --> | |
138 | |
139 <!-- direct access to the activators --> | |
140 <options type="HASH"> | |
141 <dataSource refid='ds'/> | |
142 </options> | |
143 | |
144 <!-- Set default output encoding, can be changed due query handling --> | |
145 <responseCharset>utf-8</responseCharset> | |
146 | |
147 <!-- Actions creation configuration --> | |
148 <actionFactory type="IMPL::Object::Factory"> | |
149 | |
150 <!-- Construct actions --> | |
151 <factory>IMPL::Web::Application::Action</factory> | |
152 <parameters type='HASH'> | |
153 | |
154 <!-- with special responseFactory --> | |
155 <responseFactory type='IMPL::Object::Factory'> | |
156 | |
157 <!-- Where resopnses have a special streamOut --> | |
158 <factory>IMPL::Web::Application::Response</factory> | |
159 <parameters type='HASH'> | |
160 | |
161 <!-- in memory dummy output instead of STDOUT --> | |
162 <streamOut>memory</streamOut> | |
163 | |
164 </parameters> | |
165 </responseFactory> | |
166 </parameters> | |
167 </actionFactory> | |
168 | |
169 <!-- Query processing chain --> | |
170 <handlersQuery type="IMPL::Object::List"> | |
171 <item type="IMPL::Web::QueryHandler::PageFormat"> | |
172 <templatesCharset>cp1251</templatesCharset> | |
173 </item> | |
174 </handlersQuery> | |
175 </Application> | |
176 | |
177 =end code xml | |
178 | |
73 | 179 =head1 MEMBERS |
180 | |
181 =over | |
182 | |
183 =item C<[get,set] handlerError> | |
184 | |
185 Обработчик который будет вызван в случае возникновения необработанной ошибки | |
186 в процессе работы приложения. После чего приложение корректно завершается. | |
187 | |
188 =item C<[get,set] actionFactory> | |
189 | |
190 Фабрика объектов, которая используется приложением, для создания объектов | |
191 типа C<IMPL::Web::Application::Action> при обработки C<CGI> запросов. | |
192 | |
193 =begin code | |
194 | |
195 my $action = $this->actionFactory->new( | |
196 query => $query, | |
197 application => $this, | |
198 ); | |
199 | |
200 =end code | |
201 | |
202 =item C< [get,set,list] handlersQuery > | |
203 | |
204 Список обработчиков запросов, которые будут переданы созданному объекту-действию. | |
205 | |
206 =item C< [get,set] responseCharset> | |
207 | |
208 Кодировка ответа клиенту. | |
209 | |
210 =item C< [get,set] security > | |
211 | |
212 Объект C<IMPL::Web::Security>, для работы с инфраструктурой безопасности. | |
213 | |
214 =item C< [get,set] options > | |
215 | |
216 Обычно ссылка на хеш с настраиваемыми объектами, используется для возможности | |
217 програмной настройки активаторов, т.к. напрямую через свойства приложения получить | |
218 к ним доступ не получится. | |
219 | |
220 =back | |
221 | |
222 =cut |