9. Что такое Mojo?
• Pure Perl веб-фреймворк
• Без зависимостей (начиная с Perl 5.10)
• Объектно-ориентированное API
• Поддержка HTTP 1.1 (клиент-сервер)
• CGI, FastCGI, Daemon и Daemon Prefork
• MVC веб-фреймворки:
Mojolicious и Mojolicious::Lite
18 декабря 2009 г.
10. Что такое Mojo?
• Pure Perl веб-фреймворк
• Без зависимостей (с версии Perl 5.8.1)
• Объектно-ориентированное API
• Поддержка HTTP 1.1 (клиент-сервер)
• CGI, FastCGI, Daemon и Daemon Prefork
• MVC веб-фреймворки:
Mojolicious и Mojolicious::Lite
18 декабря 2009 г.
11. Что такое Mojo?
• Pure Perl веб-фреймворк
• Без зависимостей (с версии Perl 5.8.1)
• Объектно-ориентированное API
• Поддержка HTTP 1.1 (клиент-сервер)
• CGI, FastCGI, Daemon и Daemon Prefork
• MVC веб-фреймворки:
Mojolicious и Mojolicious::Lite
18 декабря 2009 г.
12. Что такое Mojo?
• Pure Perl веб-фреймворк
• Без зависимостей (с версии Perl 5.8.1)
• Объектно-ориентированное API
• Поддержка HTTP 1.1 (клиент-сервер)
• CGI, FastCGI, Daemon и Daemon Prefork
• MVC веб-фреймворки:
Mojolicious и Mojolicious::Lite
18 декабря 2009 г.
13. Что такое Mojo?
• Pure Perl веб-фреймворк
• Без зависимостей (с версии Perl 5.8.1)
• Объектно-ориентированное API
• Поддержка HTTP 1.1 (клиент-сервер)
• CGI, FastCGI, PSGI, Daemon и Prefork
• MVC веб-фреймворки:
Mojolicious и Mojolicious::Lite
18 декабря 2009 г.
14. Что такое Mojo?
• Pure Perl веб-фреймворк
• Без зависимостей (с версии Perl 5.8.1)
• Объектно-ориентированное API
• Поддержка HTTP 1.1 (клиент-сервер)
• CGI, FastCGI, PSGI, Daemon и Prefork
• MVC веб-фреймворки:
Mojolicious и Mojolicious::Lite
18 декабря 2009 г.
15. Что такое Mojo?
• Pure Perl веб-фреймворк
• Без зависимостей (с версии Perl 5.8.1)
• Объектно-ориентированное API
• Поддержка HTTP 1.1 (клиент-сервер)
• CGI, FastCGI, PSGI, Daemon и Prefork
• MVC веб-фреймворки:
Mojolicious и Mojolicious::Lite
18 декабря 2009 г.
19. Mojo::Base
Minimal Base Class For Mojo Projects
18 декабря 2009 г.
20. 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 { ... }
18 декабря 2009 г.
21. 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 { ... }
18 декабря 2009 г.
22. 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 { ... }
18 декабря 2009 г.
92. Объектно-
ориентированное API
18 декабря 2009 г.
93. package TestMojo;
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('Hello Mojo!');
}
18 декабря 2009 г.
94. package TestMojo;
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('Hello Mojo!');
}
18 декабря 2009 г.
95. package TestMojo;
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('Hello Mojo!');
}
18 декабря 2009 г.
96. package TestMojo;
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('Hello Mojo!');
}
18 декабря 2009 г.
97. use overload '""' => sub
{ shift->to_string },
fallback => 1;
18 декабря 2009 г.
100. package TestMojo;
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('Hello Mojo!');
}
18 декабря 2009 г.
101. package TestMojo;
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('Hello Mojo!');
}
18 декабря 2009 г.
105. use FindBin;
use lib "$FindBin::Bin/../lib";
use lib "$FindBin::Bin/../../lib";
# Application
$ENV{MOJO_APP} ||= 'TestMojo';
use Mojo::Commands;
Mojo::Commands->start; # ->start(‘cgi’)
18 декабря 2009 г.
107. package TestMojo;
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('Hello Mojo!');
}
18 декабря 2009 г.
186. package TestApp;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to(controller => 'example', action =>
'welcome', id => 1);
}
18 декабря 2009 г.
187. package TestApp;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to(controller => 'example', action =>
'welcome', id => 1);
}
18 декабря 2009 г.
188. package TestApp;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to(controller => 'example', action =>
'welcome', id => 1);
}
18 декабря 2009 г.
189. package TestApp;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to(controller => 'example', action =>
'welcome', id => 1);
}
18 декабря 2009 г.
190. package TestApp;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to(controller => 'example', action =>
'welcome', id => 1);
}
18 декабря 2009 г.
191. package TestApp;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to(controller => 'example', action =>
'welcome', id => 1);
}
18 декабря 2009 г.
192. package TestApp;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->bridge->route('/:controller/:action/:id')
->to(controller => 'example', action =>
'welcome', id => 1);
}
18 декабря 2009 г.
193. package TestApp;
use base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->route('/:controller/:action/:id')
->to(controller => 'example', action =>
'welcome', id => 1);
}
18 декабря 2009 г.
194. package TestApp::Example;
use base 'Mojolicious::Controller';
sub welcome {
my $self = shift;
warn $self->stash(‘id’);
$self->render(message => 'Welcome!');
}
1;
18 декабря 2009 г.
236. use Mojolicious::Lite;
get '/' => 'index';
any '/:groovy' => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
237. use Mojolicious::Lite;
get '/' => 'index';
any '/:groovy' => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
238. use Mojolicious::Lite;
get '/' => 'index';
any '/:groovy' => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
239. use Mojolicious::Lite;
post '/' => 'index';
any '/:groovy' => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
240. use Mojolicious::Lite;
any '/' => 'index';
any '/:groovy' => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
241. use Mojolicious::Lite;
get '/' => 'index';
any '/:groovy' => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
242. use Mojolicious::Lite;
get '/' => 'index';
any '/:groovy' => [groovy => qr/d+/] => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
243. use Mojolicious::Lite;
get '/' => 'index';
any '/:groovy' => {groovy => 42} => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
244. use Mojolicious::Lite;
get '/' => 'index';
any '/:groovy' => (agent=>qr/Firefox/) => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
245. use Mojolicious::Lite;
get '/' => 'index';
any '/:groovy' => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
app->renderer->default_handler(‘epl’);
shagadelic;
18 декабря 2009 г.
246. use Mojolicious::Lite;
ladder sub { ... }; # auth
get '/' => 'index';
any '/:groovy' => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic;
18 декабря 2009 г.
247. use Mojolicious::Lite;
get '/' => 'index';
any '/:groovy' => sub {
my $self = shift;
$self->render_text($self->stash('groovy'));
};
shagadelic; # shagadelic(‘cgi’)
18 декабря 2009 г.
252. Mojo Guide Style
• Keep it simple, no magick unless absolutely nessary
• Code should be written with a Perl6 port in mind
• It’s not a feature without a test
• Only add prereqs if absolutely necessary
• No inline POD
• No spaghetti code
• Every files should contain at least one quote from
The Simpsons or Futurama
18 декабря 2009 г.
253. Mojo Guide Style
• Keep it simple, no magick unless absolutely nessary
• Code should be written with a Perl6 port in mind
• It’s not a feature without a test
• Only add prereqs if absolutely necessary
• No inline POD
• No spaghetti code
• Every files should contain at least one quote from
The Simpsons or Futurama
18 декабря 2009 г.
254. Mojo Guide Style
• Keep it simple, no magick unless absolutely nessary
• Code should be written with a Perl6 port in mind
• It’s not a feature without a test
• Only add prereqs if absolutely necessary
• No inline POD
• No spaghetti code
• Every files should contain at least one quote from
The Simpsons or Futurama
18 декабря 2009 г.
255. Mojo Guide Style
• Keep it simple, no magick unless absolutely nessary
• Code should be written with a Perl6 port in mind
• It’s not a feature without a test
• Only add prereqs if absolutely necessary
• No inline POD
• No spaghetti code
• Every files should contain at least one quote from
The Simpsons or Futurama
18 декабря 2009 г.
256. Mojo Guide Style
• Keep it simple, no magick unless absolutely nessary
• Code should be written with a Perl6 port in mind
• It’s not a feature without a test
• Only add prereqs if absolutely necessary
• No inline POD
• No spaghetti code
• Every files should contain at least one quote from
The Simpsons or Futurama
18 декабря 2009 г.
257. Mojo Guide Style
• Keep it simple, no magick unless absolutely nessary
• Code should be written with a Perl6 port in mind
• It’s not a feature without a test
• Only add prereqs if absolutely necessary
• No inline POD
• No spaghetti code
• Every files should contain at least one quote from
The Simpsons or Futurama
18 декабря 2009 г.
258. Mojo Guide Style
• Keep it simple, no magick unless absolutely nessary
• Code should be written with a Perl6 port in mind
• It’s not a feature without a test
• Only add prereqs if absolutely necessary
• No inline POD
• No spaghetti code
• Every files should contain at least one quote from
The Simpsons or Futurama :)
18 декабря 2009 г.
265. get ‘/bug/’ => sub {
my $self = shift;
# open my $fh, ‘|-’, ‘/usr/sbin/sendmail -t’;
open my $fh, ‘|-’, ‘perl test.pl’;
print $fh join "n",
'To: sharifulin at gmail.com',
'Subject: Test', '',
'Test!';
$self->render_text(‘Test’);;
};
18 декабря 2009 г.
266. get ‘/bug/’ => sub {
my $self = shift;
# open my $fh, ‘|-’, ‘/usr/sbin/sendmail -t’;
open my $fh, ‘|-’, ‘perl test.pl’;
print $fh join "n",
'To: sharifulin at gmail.com',
'Subject: Test', '',
'Test!';
$self->render_text(‘Test’);;
};
18 декабря 2009 г.
267. test.pl
#!/usr/bin/perl
warn $_ while <STDIN>;
18 декабря 2009 г.
279. 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 { ... }
18 декабря 2009 г.
280. 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 { ... }
18 декабря 2009 г.
281. package App;
use base ‘Mojo::Base’;
__PACKAGE__->attr(conf => sub {
return do ‘conf/app.conf’;
});
__PACKAGE__->attr(db => sub {
my $self = shift;
return $::DB ||= Util->db(...->{'db'});
});
sub dispatch { ... }
18 декабря 2009 г.
284. «мне кажется документацию он никогда
не напишет) он х**рит быстрее, чем
можно писать документацию для него)»
FriendFeed форева!
18 декабря 2009 г.
285. Полезная информация
• http://mojolicious.org
• http://labs.kraih.com/blog/
• http://search.cpan.org/dist/Mojo/
• http://github.com/kraih/mojo
• http://sharifulin.livejournal.com/tag/mojo
• http://getbootylicious.org/
18 декабря 2009 г.
286. Полезная информация
• http://mojolicious.org
• http://labs.kraih.com/blog/
• http://search.cpan.org/dist/Mojo/
• http://github.com/kraih/mojo
• http://sharifulin.livejournal.com/tag/mojo
• http://getbootylicious.org/
18 декабря 2009 г.
290. Полезная информация
• irc://irc.perl.org/#mojo
• http://lists.kraih.com/cgi-bin/mailman/
listinfo/mojo
• Twitter: @kraih, @vtivti, @sharifulin
• Juick: @vti, @sharifulin
18 декабря 2009 г.
291. Последние новости
• PSGI and Plack is the future of HTTP::Engine that
has support for servers like CGI, FastCGI, Apache,
AnyEvent and Mojo.
• New #mod_perlite release looks great,
#Mojolicious with CGI backend should "just
work™" on it.
• Slowly starting with documentation work, crazy
how much #Mojolicious has grown recently, looks
like it needs a few extra chapters now. :)
• Added native #PSGI support to #Mojolicious
18 декабря 2009 г.