Mercurial > pub > Impl
annotate Lib/IMPL/Web/Handler/RestController.pm @ 343:9bdccdf1f50b
Added a templates context
| author | cin | 
|---|---|
| date | Fri, 13 Sep 2013 12:53:15 +0400 | 
| parents | 71221d79e6b4 | 
| children | 16ff604298c7 | 
| rev | line source | 
|---|---|
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
1 package IMPL::Web::Handler::RestController; | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
2 use strict; | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
3 | 
| 233 | 4 use IMPL::Const qw(:prop); | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
5 use IMPL::declare { | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
6 require => { | 
| 244 | 7 Locator => 'IMPL::Web::AutoLocator', | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
8 ResourceInterface => 'IMPL::Web::Application::ResourceInterface', | 
| 
199
 
e743a8481327
Added REST support for forms (with only get and post methods)
 
sergey 
parents: 
198 
diff
changeset
 | 
9 Exception => 'IMPL::Exception', | 
| 
 
e743a8481327
Added REST support for forms (with only get and post methods)
 
sergey 
parents: 
198 
diff
changeset
 | 
10 ArgumentExecption => '-IMPL::InvalidArgumentException', | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
11 NotFoundException => 'IMPL::Web::NotFoundException' | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
12 }, | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
13 base => { | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
14 'IMPL::Object' => undef, | 
| 198 | 15 'IMPL::Object::Autofill' => '@_', | 
| 16 'IMPL::Object::Serializable' => undef | |
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
17 }, | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
18 props => [ | 
| 244 | 19 resourceFactory => PROP_RO, | 
| 233 | 20 trailingSlash => PROP_RO | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
21 ] | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
22 }; | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
23 | 
| 
199
 
e743a8481327
Added REST support for forms (with only get and post methods)
 
sergey 
parents: 
198 
diff
changeset
 | 
24 sub CTOR { | 
| 
 
e743a8481327
Added REST support for forms (with only get and post methods)
 
sergey 
parents: 
198 
diff
changeset
 | 
25 my ($this) = @_; | 
| 
 
e743a8481327
Added REST support for forms (with only get and post methods)
 
sergey 
parents: 
198 
diff
changeset
 | 
26 | 
| 244 | 27 die ArgumentException->new(resourceFactory => "A web-resource is required") | 
| 28 unless $this->resourceFactory; | |
| 29 #unless eval { $this->resourceFacotry->isa(ResourceInterface) }; | |
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
30 | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
31 } | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
32 | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
33 sub GetResourcePath { | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
34 my ($this,$action) = @_; | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
35 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
36 my $pathInfo = $action->pathInfo; | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
37 my @segments; | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
38 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
39 if (length $pathInfo) { | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
40 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
41 @segments = split(/\//, $pathInfo, $this->trailingSlash ? -1 : 0); | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
42 | 
| 230 | 43 # remove first segment if it is empty | 
| 44 shift @segments if @segments && length($segments[0]) == 0; | |
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
45 } | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
46 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
47 return @segments; | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
48 } | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
49 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
50 | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
51 sub Invoke { | 
| 
332
 
04a093f0a5a6
IMPL::Web::Application refactoring: resources are created per client request
 
cin 
parents: 
268 
diff
changeset
 | 
52 my ($this,$request) = @_; | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
53 | 
| 
332
 
04a093f0a5a6
IMPL::Web::Application refactoring: resources are created per client request
 
cin 
parents: 
268 
diff
changeset
 | 
54 my $method = $request->requestMethod; | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
55 | 
| 
332
 
04a093f0a5a6
IMPL::Web::Application refactoring: resources are created per client request
 
cin 
parents: 
268 
diff
changeset
 | 
56 my @segments = $this->GetResourcePath($request); | 
| 198 | 57 | 
| 244 | 58 my $res = $this->resourceFactory->new( | 
| 59 id => 'root', | |
| 
332
 
04a093f0a5a6
IMPL::Web::Application refactoring: resources are created per client request
 
cin 
parents: 
268 
diff
changeset
 | 
60 request => $request, | 
| 
 
04a093f0a5a6
IMPL::Web::Application refactoring: resources are created per client request
 
cin 
parents: 
268 
diff
changeset
 | 
61 location => Locator->new(base => $request->application->baseUrl), | 
| 244 | 62 ); | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
63 | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
64 while(@segments) { | 
| 
256
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
65 my $id = shift @segments; | 
| 
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
66 $res = $res->FetchChildResource($id); | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
67 } | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
68 | 
| 
332
 
04a093f0a5a6
IMPL::Web::Application refactoring: resources are created per client request
 
cin 
parents: 
268 
diff
changeset
 | 
69 $res = $res->InvokeHttpVerb($method); | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
70 } | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
71 | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
72 1; | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
73 | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
74 __END__ | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
75 | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
76 =pod | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
77 | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
78 =head1 NAME | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
79 | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
80 C<IMPL::Web::Handler::RestController> - Обрабатывает C<HTTP> запрос передавая | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
81 его соответствующему ресурсу. | 
| 213 | 82 | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
83 =head1 SYNOPSIS | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
84 | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
85 Используется в конфигурации приложения как элемент цепочки обработчиков. | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
86 Как правило располагается на самом верхнем уровне. | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
87 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
88 =begin code xml | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
89 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
90 <handlers type="ARRAY"> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
91 <item type="IMPL::Web::Handler::RestController"> | 
| 334 | 92 <resourceFactory>My::App::Web::RootResource</resourceFactory> | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
93 </item> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
94 <item type="IMPL::Web::Handler::JSONView" /> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
95 <item type="IMPL::Web::Handler::SecureCookie" /> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
96 <item type="IMPL::Web::Handler::ErrorHandler" /> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
97 </handlers> | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
98 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
99 =end code xml | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
100 | 
| 213 | 101 | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
102 =head1 DESCRIPTION | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
103 | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
104 Использует C<PATH_INFO> для определения нужного ресурса, затем предает | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
105 найденному ресурсу управление для обработки запроса. | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
106 | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
107 Если ресурс не найден, то возникает исключение C<IMPL::Web::NotFoundException>. | 
| 213 | 108 | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
109 Для определения нужного ресурса контроллер разбивает C<PATH_INFO> на фрагменты | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
110 и использует каждый фрагмент для получения дочернего ресурса начиная с корневого. | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
111 Для чего используется метод | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
112 C<< IMPL::Web::Application::ResourceInterface->FetchChildResource($childId) >>. | 
| 213 | 113 | 
| 
268
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
114 Дерево ресурсов сущестувет независимо от обрабатываемого запроса, однако оно | 
| 
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
115 может полностью или частично загружаться в начале обработки запроса и | 
| 
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
116 освобождаться по окончании обработки запроса. Поэтому при получении дочерних | 
| 
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
117 ресурсов не участвует C<HTTP> запрос, он адресуется только последнему ресурсу. | 
| 
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
118 | 
| 
256
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
119 =begin text | 
| 
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
120 | 
| 
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
121 /music/audio.mp3 -> ['music','audio.mp3'] | 
| 
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
122 | 
| 
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
123 =end text | 
| 
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
124 | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
125 =head1 MEMEBERS | 
| 213 | 126 | 
| 
256
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
127 =head2 C<[get]resourceFactory> | 
| 213 | 128 | 
| 
256
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
129 Фабрика для создания корневого ресурса приложения, полученный ресурс должен | 
| 
 
32aceba4ee6d
corrected ViewHandlers to handle cookies and headers.
 
sergey 
parents: 
255 
diff
changeset
 | 
130 реализовывать интерфейс C<IMPL::Web::Application::ResourceInterface>. | 
| 213 | 131 | 
| 
268
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
132 Фабрика может сохранять ссылку на корневой ресурс и каждый раз не создавать | 
| 
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
133 его, а возвращать уже существующий. Это вполне оправдано, если хранение | 
| 
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
134 дерева ресурсов требует меньше ресурсов, чем его создание и при этом приложение | 
| 
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
135 остается в памяти между C<HTTP> запросами. | 
| 
 
4abda21186cd
*refactoring IMPL::Web: added 'application' property to resources
 
cin 
parents: 
256 
diff
changeset
 | 
136 | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
137 =head2 C<[get]trailingSlash> | 
| 213 | 138 | 
| 
229
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
139 Если данная переменная имеет значение C<true>, то слеш в конце пути к ресурсу | 
| 
 
47f77e6409f7
heavily reworked the resource model of the web application:
 
sergey 
parents: 
213 
diff
changeset
 | 
140 будет интерпретироваться, как дочерний ресурс с пустым идентификатором. | 
| 
197
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
141 | 
| 
 
6b1dda998839
Added IMPL::declare, IMPL::require, to simplify module definitions
 
sergey 
parents:  
diff
changeset
 | 
142 =cut | 
