Contenu connexe Similaire à анатолий шарифулин Mojolicious Similaire à анатолий шарифулин Mojolicious (20) анатолий шарифулин Mojolicious6. Что такое Mojolicious?
• Pure Perl веб-фреймворк
• Без зависимостей (с версии Perl 5.8.1)
• Объектно-ориентированное API (без скрытой магии)
• Поддержка HTTP 1.1, WebSocket, IPv6, SSL, IDNA
• Поддержка CGI, FastCGI, PSGI, Daemon и Prefork
• Веб-фреймворки: Mojo, Mojolicious и Mojolicious::Lite
10. • Mojo::Base
• Mojo::ByteStream
• Mojo::Template, Mojo::JSON
• Mojo::Loader, Mojo::Log, Mojo::Path
• Mojo::URL, Mojo::Parameters, Mojo::Content
• Mojo::Message::Request,
Mojo::Message::Response,
Mojo::Headers, Mojo::Cookie, Mojo::Date
11. • Mojo::Base
• Mojo::ByteStream
• Mojo::Template, Mojo::JSON
• Mojo::Loader, Mojo::Log, Mojo::Path
• Mojo::URL, Mojo::Parameters, Mojo::Content
• Mojo::Message::Request,
Mojo::Message::Response,
Mojo::Headers, Mojo::Cookie, Mojo::Date
13. package App;
use base ‘Mojo::Base’;
__PACKAGE__->attr(conf => sub {
return do ‘conf/app.conf’;
});
__PACKAGE__->attr(db => sub {
my $self = shift;
return Util->db($self->conf->{'db'});
});
sub dispatch { ... }
14. package App;
use base ‘Mojo::Base’;
__PACKAGE__->attr(conf => sub {
return do ‘conf/app.conf’;
});
__PACKAGE__->attr(db => sub {
my $self = shift;
return Util->db($self->conf->{'db'});
});
sub dispatch { ... }
15. package App;
use base ‘Mojo::Base’;
__PACKAGE__->attr(conf => sub {
return do ‘conf/app.conf’;
});
__PACKAGE__->attr(db => sub {
my $self = shift;
return Util->db($self->conf->{'db'});
});
sub dispatch { ... }
16. package App;
use base ‘Mojo::Base’;
__PACKAGE__->attr(conf => sub {
return do ‘conf/app.conf’;
});
__PACKAGE__->attr(db => sub {
my $self = shift;
return Util->db($self->conf->{'db'});
});
sub dispatch { ... }
17. • Mojo::Base
• Mojo::ByteStream
• Mojo::Template, Mojo::JSON
• Mojo::Loader, Mojo::Log, Mojo::Path
• Mojo::URL, Mojo::Parameters, Mojo::Content
• Mojo::Message::Request,
Mojo::Message::Response,
Mojo::Headers, Mojo::Cookie, Mojo::Date
19. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
20. use Mojo::ByteStream 'b';
my $s = b('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
21. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
22. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
23. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
24. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
25. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
26. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
27. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
28. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
29. use Mojo::ByteStream;
my $s = Mojo::ByteStream->new('foo_bar');
$s->camelize; $s->decamelize;
$s->b64_encode; $s->b64_decode;
$s->encode('utf8'); $s->decode('utf8');
$s->html_escape; $s->html_unescape;
$s->qp_encode; $s->qp_decode;
$s->quote; $stream->unquote;
$s->url_escape; $s->url_unescape;
$s->xml_escape;
$s->punycode_encode; $s->punycode_decode;
30. • Mojo::Base
• Mojo::ByteStream
• Mojo::Template, Mojo::JSON
• Mojo::Loader, Mojo::Log, Mojo::Path
• Mojo::URL, Mojo::Parameters, Mojo::Content
• Mojo::Message::Request,
Mojo::Message::Response,
Mojo::Headers, Mojo::Cookie, Mojo::Date
32. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
33. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
34. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
35. % my $count = 10 * 5;
<ul>
% for (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
37. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
38. % my $list = $self->stash(‘list’);
<ul>
% if (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
39. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
40. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
41. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%== $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
42. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%= ucfirst $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
43. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
44. % my $list = $self->stash(‘list’);
<ul>
% for (@$list) {
<li>
<%= $_->{title} %>
</li>
%}
</ul>
<p><%# comment %></p>
45. 1 % my $list = $self->stash(‘list’);
2
3 <ul>
4 % for (@$list) {
5
<li>
6
<%= $_->{title} xx %>
7
</li>
8 %}
9 </ul>
10
11 <p><%# comment %></p>
46. Сообщение об ошибке
Bareword "xx" not allowed while "strict
subs" in use at template line 6.
48. • Mojo::Base
• Mojo::ByteStream
• Mojo::Template, Mojo::JSON
• Mojo::Loader, Mojo::Log, Mojo::Path
• Mojo::URL, Mojo::Parameters, Mojo::Content
• Mojo::Message::Request,
Mojo::Message::Response,
Mojo::Headers, Mojo::Cookie, Mojo::Date
50. my $json = Mojo::JSON->new;
my $string = $json->encode({foo => ‘bar’});
my $hash = $json->decode(‘{"foo":"bar"}’);
51. my $json = Mojo::JSON->new;
my $string = $json->encode({foo => ‘bar’});
my $hash = $json->decode(‘{"foo":"bar"}’);
52. • Mojo::Base
• Mojo::ByteStream
• Mojo::Template, Mojo::JSON
• Mojo::Loader, Mojo::Log, Mojo::Path
• Mojo::URL, Mojo::Parameters, Mojo::Content
• Mojo::Message::Request,
Mojo::Message::Response,
Mojo::Headers, Mojo::Cookie, Mojo::Date
54. • Mojo::Base
• Mojo::ByteStream
• Mojo::Template, Mojo::JSON
• Mojo::Loader, Mojo::Log, Mojo::Path
• Mojo::URL, Mojo::Parameters, Mojo::Content
• Mojo::Message::Request,
Mojo::Message::Response,
Mojo::Headers, Mojo::Cookie, Mojo::Date
55. • Mojo::Base
• Mojo::ByteStream
• Mojo::Template, Mojo::JSON
• Mojo::Loader, Mojo::Log, Mojo::Path
• Mojo::URL, Mojo::Parameters, Mojo::Content
• Mojo::Message::Request,
Mojo::Message::Response,
Mojo::Headers, Mojo::Cookie, Mojo::Date
56. • Mojo::Base
• Mojo::ByteStream
• Mojo::Template, Mojo::JSON
• Mojo::Loader, Mojo::Log, Mojo::Path
• Mojo::URL, Mojo::Parameters, Mojo::Content
• Mojo::Message::Request,
Mojo::Message::Response,
Mojo::Headers, Mojo::Cookie, Mojo::Date
57. • Mojo::Trasaction
• Mojo::IOLoop
• Mojo::Client, Mojo::Server
• Mojo::Server::CGI, Mojo::Server::FastCGI
• Mojo::Server::PSGI
• Mojo::Server::Daemon и ::Prefork
• Mojo::Command
• Mojo::Command::Generate и ~ Server
58. • Mojo::Trasaction
• Mojo::IOLoop
• Mojo::Client, Mojo::Server
• Mojo::Server::CGI, Mojo::Server::FastCGI
• Mojo::Server::PSGI
• Mojo::Server::Daemon и ::Prefork
• Mojo::Command
• Mojo::Command::Generate и ~ Server
59. • Mojo::Trasaction
• Mojo::IOLoop
• Mojo::Client, Mojo::Server
• Mojo::Server::CGI, Mojo::Server::FastCGI
• Mojo::Server::PSGI
• Mojo::Server::Daemon и ::Prefork
• Mojo::Command
• Mojo::Command::Generate и ~ Server
62. my $loop = Mojo::IOLoop->new;
$loop->listen(port => 3000, cb => sub {
my ($self, $id) = @_;
$self->read_cb ($id => sub { ... });
$self->write_cb($id => sub { ... });
);
my $id = $loop->connect(port => 3000, ...);
$loop->start; $loop->stop;
63. my $loop = Mojo::IOLoop->new;
$loop->listen(port => 3000, cb => sub {
my ($self, $id) = @_;
$self->read_cb ($id => sub { ... });
$self->write_cb($id => sub { ... });
);
my $id = $loop->connect(port => 3000, ...);
$loop->start; $loop->stop;
64. my $loop = Mojo::IOLoop->new;
$loop->listen(port => 3000, cb => sub {
my ($self, $id) = @_;
$self->read_cb ($id => sub { ... });
$self->write_cb($id => sub { ... });
);
my $id = $loop->connect(port => 3000, ...);
$loop->start; $loop->stop;
65. my $loop = Mojo::IOLoop->new;
$loop->listen(port => 3000, cb => sub {
my ($self, $id) = @_;
$self->read_cb ($id => sub { ... });
$self->write_cb($id => sub { ... });
);
my $id = $loop->connect(port => 3000, ...);
$loop->start; $loop->stop;
66. • Mojo::Trasaction
• Mojo::IOLoop
• Mojo::Client, Mojo::Server
• Mojo::Server::CGI, Mojo::Server::FastCGI
• Mojo::Server::PSGI
• Mojo::Server::Daemon и ::Prefork
• Mojo::Command
• Mojo::Command::Generate и ~ Server
68. my $client = Mojo::Client->new;
$client->get(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
69. my $client = Mojo::Client->new;
$self->client->get(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
70. my $client = Mojo::Client->new;
$client->get(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
71. my $client = Mojo::Client->new;
$client->head(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
72. my $client = Mojo::Client->new;
$client->post(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
73. my $client = Mojo::Client->new;
$client->put(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
74. my $client = Mojo::Client->new;
$client->async->get(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
75. my $client = Mojo::Client->new;
$client->get(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
76. my $client = Mojo::Client->new;
$client->get(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
77. my $client = Mojo::Client->new;
$client->get(
‘http://goo.gl’ => sub {
my ($self, $tx) = @_;
say $tx->res;
}
)->process;
78. my $client = Mojo::Client->new;
$client->get(‘http://goo.gl’)->res->code;
$client->get(
'http://search.twitter.com/trends.json'
)->success->json->{trends}->[0]->{name}
79. my $client = Mojo::Client->new;
$client->get(‘http://goo.gl’)->res->code;
$client->get(
'http://search.twitter.com/trends.json'
)->success->json->{trends}->[0]->{name}
81. • Mojo::Trasaction
• Mojo::IOLoop
• Mojo::Client, Mojo::Server
• Mojo::Server::CGI, Mojo::Server::FastCGI
• Mojo::Server::PSGI
• Mojo::Server::Daemon и ::Prefork
• Mojo::Command
• Mojo::Command::Generate и ~ Server
82. • Mojo::Trasaction
• Mojo::IOLoop
• Mojo::Client, Mojo::Server
• Mojo::Server::CGI, Mojo::Server::FastCGI
• Mojo::Server::PSGI
• Mojo::Server::Daemon и ::Prefork
• Mojo::Command
• Mojo::Command::Generate и ~ Server
83. • Mojo::Trasaction
• Mojo::IOLoop
• Mojo::Client, Mojo::Server
• Mojo::Server::CGI, Mojo::Server::FastCGI
• Mojo::Server::PSGI
• Mojo::Server::Daemon и ::Prefork
• Mojo::Command
• Mojo::Command::Generate и ~ Server
92. package App;
use base 'Mojo';
sub handler {
my ($self, $tx) = @_;
warn $tx->req; warn $tx->req->url;
$tx->res->headers
->content_type('text/plain');
$tx->res->body('РИТ++ 2010');
}
1;
93. package App;
use base 'Mojo';
sub handler {
my ($self, $tx) = @_;
warn $tx->req; warn $tx->req->url;
$tx->res->headers
->content_type('text/plain');
$tx->res->body('РИТ++ 2010');
}
1;
94. package App;
use base 'Mojo';
sub handler {
my ($self, $tx) = @_;
warn $tx->req; warn $tx->req->url;
$tx->res->headers
->content_type('text/plain');
$tx->res->body('РИТ++ 2010');
}
1;
95. package App;
use base 'Mojo';
sub handler {
my ($self, $tx) = @_;
warn $tx->req; warn $tx->req->url;
$tx->res->headers
->content_type('text/plain');
$tx->res->body('РИТ++ 2010');
}
1;
96. package App;
use base 'Mojo';
sub handler {
my ($self, $tx) = @_;
warn $tx->req; warn $tx->req->url;
$tx->res->headers
->content_type('text/plain');
$tx->res->body('РИТ++ 2010');
}
1;
97. package App;
use base 'Mojo';
sub handler {
my ($self, $tx) = @_;
warn $tx->req; warn $tx->req->url;
$tx->res->headers
->content_type('text/plain');
$tx->res->body('РИТ++ 2010');
}
1;
99. GET / HTTP/1.1
Connection: keep-alive
Accept: text/html, application/xhtml, ....
Accept-Charset: windows-1251, utf-8; ...
Accept-Encoding: gzip,deflate
Accept-Language: ru,en-us;q=0.7,en;q=0.3
Host: localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; ...
Content-Length: 0
Keep-Alive: 300
108. Google Summer of Code 2010
Performance tuning
the http/websocket implementation
112. PATH_INFO='/foo/bar'
script/mojolicious cgi
Легко тестировать
Можно профилировать код, используя Devel::NYTProf
117. script/mojolicious
daemon --reload
Приложение перезагружается перед запросом,
если код был изменен
122. package App;
use base 'Mojo';
sub handler {
my ($self, $tx) = @_;
warn $tx->req; warn $tx->req->url;
$tx->res->headers
->content_type('text/plain');
$tx->res->body('РИТ++ 2010');
}
1;
123. package App;
use base 'Mojo';
sub handler {
my ($self, $tx) = @_;
warn $tx->req; warn $tx->req->url;
$tx->res->headers
->content_type('text/plain');
$tx->res->body('РИТ++ 2010');
}
1;
125. script/mojo generate
app App
[write ] app/script/app
[chmod] app/script/app 744
[write ] app/lib/App.pm
[write ] app/t/basic.t
[mkdir ] app/log
126. script/app COMMAND
[OPTIONS]
script/app cgi
script/app fastcgi
script/app psgi
script/app daemon
script/app daemon_prefork
130. • Mojolicous::Controller
• Mojolicious::Plugins
• Mojolicious::Commands
• MojoX::Types
• MojoX::Session
• MojoX::Dispatcher, MojoX::Routes
131. • Mojolicous::Controller
• Mojolicious::Plugins
• Mojolicious::Commands
• MojoX::Types
• MojoX::Session
• MojoX::Dispatcher, MojoX::Routes
133. • render
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
134. • render(controller => 'foo', action => 'bar')
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
135. • render(template => 'foo/bar')
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
136. • render('foo#bar')
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
137. • render('foo#bar', format => 'html')
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
138. • render
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
139. • render
• render_text('РИТ++ 2010')
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
140. • render
• render(text => 'РИТ++ 2010')
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
141. • render
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
142. • render
• render_text
• render_data('binary data')
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
143. • render
• render_text
• render(data => 'binary data')
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
144. • render
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
145. • render
• render_text
• render_data
• render_json({foo => 'bar'})
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
146. • render
• render_text
• render_data
• render(json => {foo => 'bar'})
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
147. • render
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
148. • render
• render_text
• render_data
• render_json
• render_static('img/logo.png')
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
149. • render
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
150. • render
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
151. • render
• render_text
• render_data
• render_json
• render_static
• render_not_found / render_exception
• send_message / receive_message
• url_for / redirect_to
152. • Mojolicous::Controller
• Mojolicious::Plugins
• Mojolicious::Commands
• MojoX::Types
• MojoX::Session
• MojoX::Dispatcher, MojoX::Routes
154. • AgentCondition
• Charset
• DefaultHelpers
• EplRenderer
• EpRenderer
• HeaderCondition
• I18n, JsonConfig, PoweredBy
• PodRenderer, RequestTimer
155. • AgentCondition
• Charset
• DefaultHelpers
• EplRenderer
• EpRenderer
• HeaderCondition
• I18n, JsonConfig, PoweredBy
• PodRenderer, RequestTimer
156. • dumper
• param
• stash
• layout
• include
• content
• extends
• url_for
157. • Data::Dumper (Maxdepth: 2, Indent: 1, Terse: 1)
• param
• stash
• layout
• include
• content
• extends
• url_for
158. • dumper
• param
• stash
• layout
• include
• content
• extends
• url_for
159. • dumper
• $self->req->param( ... )
• stash
• layout
• include
• content
• extends
• url_for
160. • dumper
• param
• stash
• layout
• include
• content
• extends
• url_for
161. • dumper
• param
• $self->stash( ... )
• layout
• include
• content
• extends
• url_for
162. • dumper
• param
• stash
• layout
• include
• content
• extends
• url_for
163. • dumper
• param
• stash
• layout
• include
• content
• extends
• url_for
164. • dumper
• param
• stash
• layout
• include
• content
• extends
• url_for
165. • dumper
• param
• stash
• layout
• include
• content
• extends
• url_for
166. • dumper
• param
• stash
• layout
• include
• content
• extends
• url_for
167. • dumper
• param
• stash
• layout
• include
• content
• extends
• $self->url_for
168. • AgentCondition
• Charset
• DefaultHelpers
• EplRenderer
• EpRenderer
• HeaderCondition
• I18n, JsonConfig, PoweredBy
• PodRenderer, RequestTimer
170. • расширение шаблонов .epl
• в начале каждого шаблона:
% my $self = shift;
• $self->stash('foo')
171. • AgentCondition
• Charset
• DefaultHelpers
• EplRenderer
• EpRenderer
• HeaderCondition
• I18n, JsonConfig, PoweredBy
• PodRenderer, RequestTimer
173. • расширение шаблонов .ep
• кеширование шаблонов со stash-параметрами
• вместо $self->stash('foo') – $foo
• доступны все helpers:
% layout 'default';
% warn dumper $list;
• обработчик по умолчанию в mojolicious
174. • Mojolicous::Controller
• Mojolicious::Plugins
• Mojolicious::Commands
• MojoX::Types
• MojoX::Session
• MojoX::Dispatcher, MojoX::Routes
175. • Mojolicous::Controller
• Mojolicious::Plugins
• Mojolicious::Commands
• MojoX::Types
• MojoX::Session
• MojoX::Dispatcher, MojoX::Routes
176. • Mojolicous::Controller
• Mojolicious::Plugins
• Mojolicious::Commands
• MojoX::Types
• MojoX::Session
• MojoX::Dispatcher, MojoX::Routes
177. • Mojolicous::Controller
• Mojolicious::Plugins
• Mojolicious::Commands
• MojoX::Types
• MojoX::Session
• MojoX::Dispatcher, MojoX::Routes
179. script/mojolicious generate
app App
[write ] app/script/app
[chmod] app/script/app 744
[write ] app/lib/App.pm
[write ] app/lib/App/Example.pm
[write ] app/t/basic.t
[mkdir ] app/log
180. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
181. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
182. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
183. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
184. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
185. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:id', id => qr/d+/)
->to('example#welcome');
}
1;
186. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
for ($r->bridge->to('auth#check) {
$_->route('/admin')->to('admin#welcome');
}
}
187. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
for ($r->bridge->to('auth#check) {
$_->route('/admin')->to('admin#welcome');
}
}
188. package App;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to('example#welcome', id => 1);
}
1;
189. script/mojolicious generate
app App
[write ] app/script/app
[chmod] app/script/app 744
[write ] app/lib/App.pm
[write ] app/lib/App/Example.pm
[write ] app/t/basic.t
[mkdir ] app/log
190. package App::Example;
use base 'Mojolicious::Controller';
sub welcome {
my $self = shift;
warn $self->stash(‘id’);
$self->render(message => 'РИТ++ 2010');
}
1;
191. package App::Example;
use base 'Mojolicious::Controller';
sub welcome {
my $self = shift;
warn $self->stash(‘id’);
$self->render(message => 'РИТ++ 2010');
}
1;
192. package App::Example;
use base 'Mojolicious::Controller';
sub welcome {
my $self = shift;
warn $self->stash(‘id’);
$self->render(message => 'РИТ++ 2010');
}
1;
193. script/mojolicious generate
app App
[mkdir] app/public
[write ] app/templates/not_found.html.ep
[write ] app/templates/exception.html.ep
[write ] app/templates/layouts/default.html.ep
[write ] app/templates/example/welcome.html.ep
194. script/mojolicious generate
app App
[mkdir] app/public
[write ] app/templates/not_found.html.ep
[write ] app/templates/exception.html.ep
[write ] app/templates/layouts/default.html.ep
[write ] app/templates/example/welcome.html.ep
195. script/mojolicious generate
app App
[mkdir] app/public
[write ] app/templates/not_found.html.ep
[write ] app/templates/exception.html.ep
[write ] app/templates/layouts/default.html.ep
[write ] app/templates/example/welcome.html.ep
202. script/mojolicious generate
app App
[mkdir] app/public
[write ] app/templates/not_found.html.ep
[write ] app/templates/exception.html.ep
[write ] app/templates/layouts/default.html.ep
[write ] app/templates/example/welcome.html.ep
205. script/mojolicious generate
app App
[mkdir] app/public
[write ] app/templates/not_found.html.ep
[write ] app/templates/exception.html.ep
[write ] app/templates/layouts/default.html.ep
[write ] app/templates/example/welcome.html.ep
206. script/mojolicious generate
app App
[mkdir] app/public
[write ] app/templates/not_found.html.ep
[write ] app/templates/exception.html.ep
[write ] app/templates/layouts/default.html.ep
[write ] app/templates/example/welcome.html.ep
207. Global symbol "$message2" requires explicit
package name at (eval 280) line 2.
1: % layout 'default';
2: <h2><%= $message2 %></h2>
3: ...
{
'status' => 500,
'message' => ‘РИТ++ 2010’,
...
212. example/
welcome.rss.ep
Автоматическая генерация имени шаблона
218. script/app COMMAND
[OPTIONS]
script/app cgi
script/app fastcgi
script/app psgi
script/app daemon
script/app daemon_prefork
222. use Mojolicious::Lite;
get '/' => 'index';
get '/:groovy' => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->start;
223. use Mojolicious::Lite;
get '/' => 'index';
get '/:groovy' => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->start;
224. use Mojolicious::Lite;
get '/' => 'index';
get '/:groovy' => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->start;
226. use Mojolicious::Lite;
any '/' => 'index';
get '/:groovy' => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->start;
227. use Mojolicious::Lite;
get '/' => (agent => qr/Firefox/) => 'index';
get '/:groovy' => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->start;
228. use Mojolicious::Lite;
get '/' => 'index';
get '/:groovy' => {groovy => 42} => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->start;
229. use Mojolicious::Lite;
get '/' => 'index';
get '/:groovy' => [groovy => qr/d+/] => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->start;
230. use Mojolicious::Lite;
ladder sub {}; # auth
get '/' => 'index';
get '/:groovy' => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->start;
232. use Mojolicious::Lite;
get '/' => 'index';
get '/:groovy' => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->renderer->default_handler('epl');
app->start;
233. use Mojolicious::Lite;
get '/' => 'index';
get '/:groovy' => sub {
my $self = shift;
$self->render_text( $self->param('groovy') );
};
app->start;
234. __DATA__
@@ index.html.ep
% layout 'funky';
Yea baby!
@@ layouts/funky.html.ep
<!doctype html><html>
<head><title>Funky!</title></head>
<body><%== content %></body>
</html>
235. __DATA__
@@ index.html.ep
% layout 'funky';
Yea baby!
@@ layouts/funky.html.ep
<!doctype html><html>
<head><title>Funky!</title></head>
<body><%== content %></body>
</html>
236. lite.pl COMMAND
[OPTIONS]
lite.pl cgi
lite.pl fastcgi
lite.pl psgi
lite.pl daemon
lite.pl daemon_prefork
237. lite.pl COMMAND
[OPTIONS]
lite.pl test
lite.pl get
lite.pl routes
lite.pl inflate
241. Mojolicious-модули на CPAN
• Mojolicious • MojoX::Routes::AsGraph
• Mojo::Server::FCGI • MojoX::Log::*
• AnyEvent::Mojo • MojoX::Renderer::*
• Apache::Mojo
Apache2::Mojo • TT
• Catalyst::Engine::Mojo • CTTP2, HTP
Squatting::On::Mojo • XSLT
247. Документация
• Пока не очень, зато очень хороший фидбек :)
• Mojolicious::Lite и Mojolicious::Guides
• Mojolicious Handbook на github.com @kvorg
• Mojolicious FAQ на github.com @vti