256
Mojolicious. Веб в коробке! Анатолий Шарифулин

анатолий шарифулин Mojolicious финальная версия

  • Upload
    rit2010

  • View
    2.291

  • Download
    4

Embed Size (px)

Citation preview

Page 1: анатолий шарифулин Mojolicious   финальная версия

Mojolicious.Веб в коробке!

Анатолий Шарифулин

Page 2: анатолий шарифулин Mojolicious   финальная версия

http://mojolicious.org/

Page 3: анатолий шарифулин Mojolicious   финальная версия

Sebastian Riedelавтор Catalyst и Mojolicious

http://twitter.com/kraih

Page 4: анатолий шарифулин Mojolicious   финальная версия

http://mojolicious.org/

Page 5: анатолий шарифулин Mojolicious   финальная версия

Что такоеMojolicious?

Page 6: анатолий шарифулин Mojolicious   финальная версия

Что такое Mojolicious?• Pure Perl веб-фреймворк

• Без зависимостей (с версии Perl 5.8.1)

• Объектно-ориентированное API (без скрытой магии)

• Поддержка HTTP 1.1, WebSocket, IPv6, SSL, IDNA

• Поддержка CGI, FastCGI, PSGI, Daemon и Prefork

• Веб-фреймворки: Mojo, Mojolicious и Mojolicious::Lite

Page 7: анатолий шарифулин Mojolicious   финальная версия

«Fresh code,based upon years of expirience developing

Catalyst»

Page 8: анатолий шарифулин Mojolicious   финальная версия

http://mojolicious.org/

Page 9: анатолий шарифулин Mojolicious   финальная версия

Pure Perlвеб-фреймворк

Page 10: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 11: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 12: анатолий шарифулин Mojolicious   финальная версия

Mojo::BaseMinimal Base Class For Mojo Projects

Page 13: анатолий шарифулин Mojolicious   финальная версия

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 { ... }

Page 14: анатолий шарифулин Mojolicious   финальная версия

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 { ... }

Page 15: анатолий шарифулин Mojolicious   финальная версия

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 { ... }

Page 16: анатолий шарифулин Mojolicious   финальная версия

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 { ... }

Page 17: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 18: анатолий шарифулин Mojolicious   финальная версия

Mojo::ByteStreamByteStream

Page 19: анатолий шарифулин Mojolicious   финальная версия

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;

Page 20: анатолий шарифулин Mojolicious   финальная версия

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;

Page 21: анатолий шарифулин Mojolicious   финальная версия

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;

Page 22: анатолий шарифулин Mojolicious   финальная версия

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;

Page 23: анатолий шарифулин Mojolicious   финальная версия

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;

Page 24: анатолий шарифулин Mojolicious   финальная версия

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;

Page 25: анатолий шарифулин Mojolicious   финальная версия

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;

Page 26: анатолий шарифулин Mojolicious   финальная версия

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;

Page 27: анатолий шарифулин Mojolicious   финальная версия

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;

Page 28: анатолий шарифулин Mojolicious   финальная версия

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;

Page 29: анатолий шарифулин Mojolicious   финальная версия

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;

Page 30: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 31: анатолий шарифулин Mojolicious   финальная версия

Mojo::TemplatePerlish Templates!

Page 32: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 33: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 34: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 35: анатолий шарифулин Mojolicious   финальная версия

% my $count = 10 * 5;

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 36: анатолий шарифулин Mojolicious   финальная версия

% use Foo::Bar;

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 37: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 38: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% if (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 39: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 40: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 41: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%== $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 42: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= ucfirst $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 43: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 44: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= $_->{title} %> </li>% }</ul>

<p><%# comment %></p>

Page 45: анатолий шарифулин Mojolicious   финальная версия

% my $list = $self->stash(‘list’);

<ul>% for (@$list) { <li> <%= $_->{title} xx %> </li>% }</ul>

<p><%# comment %></p>

1 2 3 4 5 6 7 8 91011

Page 46: анатолий шарифулин Mojolicious   финальная версия

Bareword "xx" not allowed while "strict subs" in use at template line 6.

Сообщение об ошибке

Page 47: анатолий шарифулин Mojolicious   финальная версия

Простота PHP, мощь Perl

Page 48: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 49: анатолий шарифулин Mojolicious   финальная версия

Mojo::JSONMinimalistic JSON

Page 50: анатолий шарифулин Mojolicious   финальная версия

my $json = Mojo::JSON->new;

my $string = $json->encode({foo => ‘bar’});

my $hash = $json->decode(‘{"foo":"bar"}’);

Page 51: анатолий шарифулин Mojolicious   финальная версия

my $json = Mojo::JSON->new;

my $string = $json->encode({foo => ‘bar’});

my $hash = $json->decode(‘{"foo":"bar"}’);

Page 52: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 53: анатолий шарифулин Mojolicious   финальная версия

Mojo::LoaderClass loader: load, reload, search

Page 54: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 55: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 56: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 57: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 58: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 59: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 60: анатолий шарифулин Mojolicious   финальная версия

Mojo::IOLoopMinimalistic Reactor For TCP Clients And Servers

Page 61: анатолий шарифулин Mojolicious   финальная версия

Mojo::IOLoopПоддержка IO::KQueue, IO::Epoll,IO::Socket::INET6 и IO::Socket::SSL

Page 62: анатолий шарифулин Mojolicious   финальная версия

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;

Page 63: анатолий шарифулин Mojolicious   финальная версия

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;

Page 64: анатолий шарифулин Mojolicious   финальная версия

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;

Page 65: анатолий шарифулин Mojolicious   финальная версия

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;

Page 66: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 67: анатолий шарифулин Mojolicious   финальная версия

Mojo::ClientAsync IO HTTP 1.1 And WebSocket Client

Page 68: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 69: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$self->client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 70: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 71: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$client->head( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 72: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$client->post( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 73: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$client->put( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 74: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$client->async->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 75: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 76: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 77: анатолий шарифулин Mojolicious   финальная версия

my $client = Mojo::Client->new;

$client->get( ‘http://goo.gl’ => sub { my ($self, $tx) = @_; say $tx->res; })->process;

Page 78: анатолий шарифулин Mojolicious   финальная версия

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}

Page 79: анатолий шарифулин Mojolicious   финальная версия

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}

Page 80: анатолий шарифулин Mojolicious   финальная версия

script/mojoliciousget 'http://goo.gl'

Page 81: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 82: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 83: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 84: анатолий шарифулин Mojolicious   финальная версия

Всё, что нужно – естьMojolicious – веб в коробке!

Page 85: анатолий шарифулин Mojolicious   финальная версия

Без зависимостейс версии Perl 5.8.1

Page 86: анатолий шарифулин Mojolicious   финальная версия

Mojo runtime

Page 87: анатолий шарифулин Mojolicious   финальная версия

Perl 5.005

Page 88: анатолий шарифулин Mojolicious   финальная версия

Perl 5.006002

Page 89: анатолий шарифулин Mojolicious   финальная версия

Perl 5.008001

Page 90: анатолий шарифулин Mojolicious   финальная версия

Perl 5.010

Page 91: анатолий шарифулин Mojolicious   финальная версия

Объектно-ориентированное

API

Page 92: анатолий шарифулин Mojolicious   финальная версия

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;

Page 93: анатолий шарифулин Mojolicious   финальная версия

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;

Page 94: анатолий шарифулин Mojolicious   финальная версия

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;

Page 95: анатолий шарифулин Mojolicious   финальная версия

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;

Page 96: анатолий шарифулин Mojolicious   финальная версия

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;

Page 97: анатолий шарифулин Mojolicious   финальная версия

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;

Page 98: анатолий шарифулин Mojolicious   финальная версия

use overload '""' => sub { shift->to_string },

fallback => 1;

Page 99: анатолий шарифулин Mojolicious   финальная версия

GET / HTTP/1.1Connection: keep-aliveAccept: text/html, application/xhtml, ....Accept-Charset: windows-1251, utf-8; ...Accept-Encoding: gzip,deflateAccept-Language: ru,en-us;q=0.7,en;q=0.3Host: localhost:3000User-Agent: Mozilla/5.0 (Macintosh; ...Content-Length: 0Keep-Alive: 300

Page 100: анатолий шарифулин Mojolicious   финальная версия

Поддержка HTTP 1.1клиент-сервер

Page 101: анатолий шарифулин Mojolicious   финальная версия
Page 102: анатолий шарифулин Mojolicious   финальная версия

Google Summer of Code 2009Pascal Gaudette

MojoX::UserAgent

Page 103: анатолий шарифулин Mojolicious   финальная версия

Поддержка WebSocketклиент-сервер

Page 104: анатолий шарифулин Mojolicious   финальная версия

Протокол WebSocketGoogle, Inc

16 декабря 2009 года

Page 105: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

websocket ‘/echo’ => sub { my $self = shift; $self->receive_message(sub { my ($self, $msg) = @_; $self->send_massage("echo: $msg"); });};

app->start;

Page 106: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

websocket ‘/echo’ => sub { my $self = shift; $self->receive_message(sub { my ($self, $msg) = @_; $self->send_massage("echo: $msg"); });};

app->start;

Page 107: анатолий шарифулин Mojolicious   финальная версия

Mojolicious WebSocket ExamplesИнтересный пример IRC-клиент

Github.com @xantus

Page 108: анатолий шарифулин Mojolicious   финальная версия

Google Summer of Code 2010Performance tuning

the http/websocket implementation

Page 109: анатолий шарифулин Mojolicious   финальная версия

Поддержка CGI, FastCGI, PSGI,

Daemon и Prefork

Page 110: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious COMMAND [OPTIONS]script/mojolicious cgiscript/mojolicious fastcgiscript/mojolicious psgi script/mojolicious daemonscript/mojolicious daemon_prefork

Page 111: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious COMMAND [OPTIONS]script/mojolicious cgiscript/mojolicious fastcgiscript/mojolicious psgi script/mojolicious daemonscript/mojolicious daemon_prefork

Page 112: анатолий шарифулин Mojolicious   финальная версия

PATH_INFO='/foo/bar' script/mojolicious cgi

Легко тестироватьМожно профилировать код, используя Devel::NYTProf

Page 113: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious COMMAND [OPTIONS]script/mojolicious cgiscript/mojolicious fastcgiscript/mojolicious psgi script/mojolicious daemonscript/mojolicious daemon_prefork

Page 114: анатолий шарифулин Mojolicious   финальная версия

Mojo::Server::FCGIscript/mojolicious fcgiscript/mojolicious fcgi_prefork

Page 115: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious COMMAND [OPTIONS]script/mojolicious cgiscript/mojolicious fastcgiscript/mojolicious psgi script/mojolicious daemonscript/mojolicious daemon_prefork

Page 116: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious COMMAND [OPTIONS]script/mojolicious cgiscript/mojolicious fastcgiscript/mojolicious psgi script/mojolicious daemonscript/mojolicious daemon_prefork

Page 117: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious daemon --reload

Приложение перезагружается перед запросом,если код был изменен

Page 118: анатолий шарифулин Mojolicious   финальная версия

Обработка сигнала USR1Для обновления кода приложения

Page 119: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious COMMAND [OPTIONS]script/mojolicious cgiscript/mojolicious fastcgiscript/mojolicious psgi script/mojolicious daemonscript/mojolicious daemon_prefork

Page 120: анатолий шарифулин Mojolicious   финальная версия

Веб-фреймворки

Page 121: анатолий шарифулин Mojolicious   финальная версия

MojoBase framework

Page 122: анатолий шарифулин Mojolicious   финальная версия

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;

Page 123: анатолий шарифулин Mojolicious   финальная версия

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;

Page 124: анатолий шарифулин Mojolicious   финальная версия

Генерацияmojo-приложения

Page 125: анатолий шарифулин Mojolicious   финальная версия

script/mojo generateapp App

[write ] app/script/app[chmod] app/script/app 744[write ] app/lib/App.pm[write ] app/t/basic.t[mkdir ] app/log

Page 126: анатолий шарифулин Mojolicious   финальная версия

script/app COMMAND [OPTIONS]script/app cgiscript/app fastcgiscript/app psgi script/app daemonscript/app daemon_prefork

Page 127: анатолий шарифулин Mojolicious   финальная версия

script/app COMMAND [OPTIONS]script/app getscript/app test

Page 128: анатолий шарифулин Mojolicious   финальная версия

MVC веб-фреймворки

Page 129: анатолий шарифулин Mojolicious   финальная версия

Mojolicioususe base 'Mojo';

Page 130: анатолий шарифулин Mojolicious   финальная версия

• Mojolicous::Controller

• Mojolicious::Plugins

• Mojolicious::Commands

• MojoX::Types

• MojoX::Session

• MojoX::Dispatcher, MojoX::Routes

Page 131: анатолий шарифулин Mojolicious   финальная версия

• Mojolicous::Controller

• Mojolicious::Plugins

• Mojolicious::Commands

• MojoX::Types

• MojoX::Session

• MojoX::Dispatcher, MojoX::Routes

Page 132: анатолий шарифулин Mojolicious   финальная версия

Mojolicious::ControllerController Base Class

Page 133: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 134: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 135: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 136: анатолий шарифулин Mojolicious   финальная версия

• render('foo#bar')

• render_text

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 137: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 138: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 139: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text('РИТ++ 2010')

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 140: анатолий шарифулин Mojolicious   финальная версия

• render

• render(text => 'РИТ++ 2010')

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 141: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 142: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data('binary data')

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 143: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render(data => 'binary data')

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 144: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 145: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render_json({foo => 'bar'})

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 146: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render(json => {foo => 'bar'})

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 147: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 148: анатолий шарифулин Mojolicious   финальная версия

• 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

Page 149: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 150: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 151: анатолий шарифулин Mojolicious   финальная версия

• render

• render_text

• render_data

• render_json

• render_static

• render_not_found / render_exception

• send_message / receive_message

• url_for / redirect_to

Page 152: анатолий шарифулин Mojolicious   финальная версия

• Mojolicous::Controller

• Mojolicious::Plugins

• Mojolicious::Commands

• MojoX::Types

• MojoX::Session

• MojoX::Dispatcher, MojoX::Routes

Page 153: анатолий шарифулин Mojolicious   финальная версия

Mojolicious::PluginsPlugins

Page 154: анатолий шарифулин Mojolicious   финальная версия

• AgentCondition

• Charset

• DefaultHelpers

• EplRenderer

• EpRenderer

• HeaderCondition

• I18n, JsonConfig, PoweredBy

• PodRenderer, RequestTimer

Page 155: анатолий шарифулин Mojolicious   финальная версия

• AgentCondition

• Charset

• DefaultHelpers

• EplRenderer

• EpRenderer

• HeaderCondition

• I18n, JsonConfig, PoweredBy

• PodRenderer, RequestTimer

Page 156: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• stash

• layout

• include

• content

• extends

• url_for

Page 157: анатолий шарифулин Mojolicious   финальная версия

• Data::Dumper (Maxdepth: 2, Indent: 1, Terse: 1)

• param

• stash

• layout

• include

• content

• extends

• url_for

Page 158: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• stash

• layout

• include

• content

• extends

• url_for

Page 159: анатолий шарифулин Mojolicious   финальная версия

• dumper

• $self->req->param( ... )

• stash

• layout

• include

• content

• extends

• url_for

Page 160: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• stash

• layout

• include

• content

• extends

• url_for

Page 161: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• $self->stash( ... )

• layout

• include

• content

• extends

• url_for

Page 162: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• stash

• layout

• include

• content

• extends

• url_for

Page 163: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• stash

• layout

• include

• content

• extends

• url_for

Page 164: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• stash

• layout

• include

• content

• extends

• url_for

Page 165: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• stash

• layout

• include

• content

• extends

• url_for

Page 166: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• stash

• layout

• include

• content

• extends

• url_for

Page 167: анатолий шарифулин Mojolicious   финальная версия

• dumper

• param

• stash

• layout

• include

• content

• extends

• $self->url_for

Page 168: анатолий шарифулин Mojolicious   финальная версия

• AgentCondition

• Charset

• DefaultHelpers

• EplRenderer

• EpRenderer

• HeaderCondition

• I18n, JsonConfig, PoweredBy

• PodRenderer, RequestTimer

Page 169: анатолий шарифулин Mojolicious   финальная версия

EplRendererEmbed Perl Lite

Page 170: анатолий шарифулин Mojolicious   финальная версия

• расширение шаблонов .epl

• в начале каждого шаблона:% my $self = shift;

• $self->stash('foo')

Page 171: анатолий шарифулин Mojolicious   финальная версия

• AgentCondition

• Charset

• DefaultHelpers

• EplRenderer

• EpRenderer

• HeaderCondition

• I18n, JsonConfig, PoweredBy

• PodRenderer, RequestTimer

Page 172: анатолий шарифулин Mojolicious   финальная версия

EpRendererEmbed Perl

Page 173: анатолий шарифулин Mojolicious   финальная версия

• расширение шаблонов .ep

• кеширование шаблонов со stash-параметрами

• вместо $self->stash('foo') – $foo

• доступны все helpers:

% layout 'default';

% warn dumper $list;

• обработчик по умолчанию в mojolicious

Page 174: анатолий шарифулин Mojolicious   финальная версия

• Mojolicous::Controller

• Mojolicious::Plugins

• Mojolicious::Commands

• MojoX::Types

• MojoX::Session

• MojoX::Dispatcher, MojoX::Routes

Page 175: анатолий шарифулин Mojolicious   финальная версия

• Mojolicous::Controller

• Mojolicious::Plugins

• Mojolicious::Commands

• MojoX::Types

• MojoX::Session

• MojoX::Dispatcher, MojoX::Routes

Page 176: анатолий шарифулин Mojolicious   финальная версия

• Mojolicous::Controller

• Mojolicious::Plugins

• Mojolicious::Commands

• MojoX::Types

• MojoX::Session

• MojoX::Dispatcher, MojoX::Routes

Page 177: анатолий шарифулин Mojolicious   финальная версия

• Mojolicous::Controller

• Mojolicious::Plugins

• Mojolicious::Commands

• MojoX::Types

• MojoX::Session

• MojoX::Dispatcher, MojoX::Routes

Page 178: анатолий шарифулин Mojolicious   финальная версия

Генерацияmojolicious-приложения

Page 179: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious generateapp 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

Page 180: анатолий шарифулин Mojolicious   финальная версия

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;

Page 181: анатолий шарифулин Mojolicious   финальная версия

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;

Page 182: анатолий шарифулин Mojolicious   финальная версия

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;

Page 183: анатолий шарифулин Mojolicious   финальная версия

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;

Page 184: анатолий шарифулин Mojolicious   финальная версия

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;

Page 185: анатолий шарифулин Mojolicious   финальная версия

package App;use base 'Mojolicious';

sub startup { my $self = shift; my $r = $self->routes; $r->route('/:id', id => qr/\d+/) ->to('example#welcome');}

1;

Page 186: анатолий шарифулин Mojolicious   финальная версия

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'); }}

Page 187: анатолий шарифулин Mojolicious   финальная версия

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'); }}

Page 188: анатолий шарифулин Mojolicious   финальная версия

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;

Page 189: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious generateapp 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

Page 190: анатолий шарифулин Mojolicious   финальная версия

package App::Example;use base 'Mojolicious::Controller';

sub welcome { my $self = shift; warn $self->stash(‘id’); $self->render(message => 'РИТ++ 2010');}

1;

Page 191: анатолий шарифулин Mojolicious   финальная версия

package App::Example;use base 'Mojolicious::Controller';

sub welcome { my $self = shift; warn $self->stash(‘id’); $self->render(message => 'РИТ++ 2010');}

1;

Page 192: анатолий шарифулин Mojolicious   финальная версия

package App::Example;use base 'Mojolicious::Controller';

sub welcome { my $self = shift; warn $self->stash(‘id’); $self->render(message => 'РИТ++ 2010');}

1;

Page 193: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious generateapp 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

Page 194: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious generateapp 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

Page 195: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious generateapp 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

Page 196: анатолий шарифулин Mojolicious   финальная версия

% layout 'default';

<h2><%= $message %></h2>

<a href="<%== url_for %>">click here</a>

Page 197: анатолий шарифулин Mojolicious   финальная версия

% layout 'default';

<h2><%= $message %></h2>

<a href="<%== url_for %>">click here</a>

Page 198: анатолий шарифулин Mojolicious   финальная версия

% layout 'default';

<h2><%= $self->stash('message') %></h2>

<a href="<%== url_for %>">click here</a>

Page 199: анатолий шарифулин Mojolicious   финальная версия

% layout 'default';

<h2><%= $message %></h2>

<a href="<%== url_for %>">click here</a>

Page 200: анатолий шарифулин Mojolicious   финальная версия

% layout 'default';

<h2><%= stash 'message' %></h2>

<a href="<%== url_for %>">click here</a>

Page 201: анатолий шарифулин Mojolicious   финальная версия

% layout 'default';

<h2><%= $message %></h2>

<a href="<%== url_for %>">click here</a>

Page 202: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious generateapp 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

Page 203: анатолий шарифулин Mojolicious   финальная версия

<!doctype html><html> <head><title>Welcome</title></head> <body> <%== content %> </body></html>

Page 204: анатолий шарифулин Mojolicious   финальная версия

<!doctype html><html> <head><title>Welcome</title></head> <body> <%== content %> </body></html>

Page 205: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious generateapp 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

Page 206: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious generateapp 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

Page 207: анатолий шарифулин Mojolicious   финальная версия

Global symbol "$message2" requires explicit package name at (eval 280) line 2.

1: % layout 'default';2: <h2><%= $message2 %></h2>3: ...

{ 'status' => 500, 'message' => ‘РИТ++ 2010’, ...

Page 208: анатолий шарифулин Mojolicious   финальная версия

example/welcome.html.ep

Автоматическая генерация имени шаблона

Page 209: анатолий шарифулин Mojolicious   финальная версия

controller/action.format.handler

Автоматическая генерация имени шаблона

Page 210: анатолий шарифулин Mojolicious   финальная версия

example/welcome.html.ep

Автоматическая генерация имени шаблона

Page 211: анатолий шарифулин Mojolicious   финальная версия

example/welcome.xml.ep

Автоматическая генерация имени шаблона

Page 212: анатолий шарифулин Mojolicious   финальная версия

example/welcome.rss.ep

Автоматическая генерация имени шаблона

Page 213: анатолий шарифулин Mojolicious   финальная версия

example/welcome.json.ep

Автоматическая генерация имени шаблона

Page 214: анатолий шарифулин Mojolicious   финальная версия

example/welcome.html.ep

Автоматическая генерация имени шаблона

Page 215: анатолий шарифулин Mojolicious   финальная версия

example/welcome.html.epl

Автоматическая генерация имени шаблона

Page 216: анатолий шарифулин Mojolicious   финальная версия

example/welcome.html.tt

Автоматическая генерация имени шаблона

Page 217: анатолий шарифулин Mojolicious   финальная версия

example/welcome.html.cttp2 Автоматическая генерация имени шаблона

Page 218: анатолий шарифулин Mojolicious   финальная версия

script/app COMMAND [OPTIONS]script/app cgiscript/app fastcgiscript/app psgi script/app daemonscript/app daemon_prefork

Page 219: анатолий шарифулин Mojolicious   финальная версия

script/app COMMAND [OPTIONS]script/app getscript/app testscript/app routes

Page 220: анатолий шарифулин Mojolicious   финальная версия

Mojolicious::Liteuse base 'Mojolicious';

Page 221: анатолий шарифулин Mojolicious   финальная версия

script/mojolicious generatelite_app lite.pl

[write ] lite.pl[chmod] lite.pl 744

Page 222: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

get '/' => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 223: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

get '/' => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 224: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

get '/' => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 225: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

post '/' => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 226: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

any '/' => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 227: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

get '/' => (agent => qr/Firefox/) => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 228: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

get '/' => 'index';

get '/:groovy' => {groovy => 42} => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 229: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

get '/' => 'index';

get '/:groovy' => [groovy => qr/\d+/] => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 230: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;ladder sub {}; # authget '/' => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 231: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;websocket '/echo' => sub { ... }; get '/' => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 232: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

get '/' => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};app->renderer->default_handler('epl');app->start;

Page 233: анатолий шарифулин Mojolicious   финальная версия

use Mojolicious::Lite;

get '/' => 'index';

get '/:groovy' => sub { my $self = shift; $self->render_text( $self->param('groovy') );};

app->start;

Page 234: анатолий шарифулин Mojolicious   финальная версия

__DATA__

@@ index.html.ep% layout 'funky';Yea baby!

@@ layouts/funky.html.ep<!doctype html><html> <head><title>Funky!</title></head> <body><%== content %></body></html>

Page 235: анатолий шарифулин Mojolicious   финальная версия

__DATA__

@@ index.html.ep% layout 'funky';Yea baby!

@@ layouts/funky.html.ep<!doctype html><html> <head><title>Funky!</title></head> <body><%== content %></body></html>

Page 236: анатолий шарифулин Mojolicious   финальная версия

lite.pl COMMAND [OPTIONS]

lite.pl cgilite.pl fastcgilite.pl psgilite.pl daemonlite.pl daemon_prefork

Page 237: анатолий шарифулин Mojolicious   финальная версия

lite.pl COMMAND [OPTIONS]

lite.pl testlite.pl getlite.pl routeslite.pl inflate

Page 238: анатолий шарифулин Mojolicious   финальная версия

«Making hard things possible and everything fun!»

Девиз Mojolicious

Page 239: анатолий шарифулин Mojolicious   финальная версия

«Viva la revolution!»

Девиз Mojolicious #2

Page 240: анатолий шарифулин Mojolicious   финальная версия

«Duct tape for the HTML5 web»

Девиз Mojolicious #3

Page 241: анатолий шарифулин Mojolicious   финальная версия

Mojolicious-модули на CPAN• Mojolicious

• Mojo::Server::FCGI

• AnyEvent::Mojo

• Apache::Mojo

Apache2::Mojo

• Catalyst::Engine::MojoSquatting::On::Mojo

• MojoX::Routes::AsGraph

• MojoX::Log::*

• MojoX::Renderer::*

• TT

• CTTP2, HTP

• XSLT

Page 242: анатолий шарифулин Mojolicious   финальная версия

Mojolicious::Lite vs.

DancerСоревнование

Page 243: анатолий шарифулин Mojolicious   финальная версия

Стабильная версия, совместимость?

Page 244: анатолий шарифулин Mojolicious   финальная версия

Обратная совместимость не гарантируется :)

До первой стабильной версии

Page 245: анатолий шарифулин Mojolicious   финальная версия

Mojolicious 0.999925Последняя версия доступна на github.com

Page 246: анатолий шарифулин Mojolicious   финальная версия

Стабильная версия, совместимость?

Page 247: анатолий шарифулин Mojolicious   финальная версия

Документация

• Пока не очень, зато очень хороший фидбек :) • Mojolicious::Lite и Mojolicious::Guides

• Mojolicious Handbook на github.com @kvorg

• Mojolicious FAQ на github.com @vti

Page 248: анатолий шарифулин Mojolicious   финальная версия

Полезная информация• http://mojolicious.org

• irc://irc.perl.org/#mojo

• http://groups.google.com/group/mojolicious

• Github: kraih, vti, xantus

• Twitter: @kraih, @vtivti, @sharifulin

• Juick: @vti, @sharifulin

Page 249: анатолий шарифулин Mojolicious   финальная версия

«Особая разновидность современного программиста – программист, изучающий

фреймворки»

Page 250: анатолий шарифулин Mojolicious   финальная версия

«Каждый программист должен сделать 3 вещи: фреймворк, шаблонизатор и событийную машину»

Page 251: анатолий шарифулин Mojolicious   финальная версия

use Mojoliciousor die;

Page 252: анатолий шарифулин Mojolicious   финальная версия

Viva la revolution!

Page 253: анатолий шарифулин Mojolicious   финальная версия

use Perlor die;

Page 254: анатолий шарифулин Mojolicious   финальная версия

JFDI

Page 255: анатолий шарифулин Mojolicious   финальная версия

any ‘/questions’ => sub { shift->render( answer => ‘sharifulin’, ); };

Page 256: анатолий шарифулин Mojolicious   финальная версия

Спасибо за внимание!Это 255й слайдАнатолий Шарифулин