KEMBAR78
Perl Dancer, FPW 2010 | ODP
Perl Dancer Journées Perl 2010 11 juin 2010, Calais
Alexis Sukrieh Twitter : @sukria CPAN : sukria http://www.sukria.net
http://perldancer.org
$ sudo cpan m  Dancer
http://github.com/sukria/Dancer
framework   web pour Perl
Encore un ?
OUI
Pourquoi ?
Dépasser CGI.pm
Oublier CGI.pm
Sans devenir Catalyst
Apporter une différence
Ruby
Nouvelle approche
Pourquoi pas Perl ?
Dancer
Dancer est un framework...
un  micro  framework
Léger
Autonome
Peu de dépendances
Compatible PSGI/Plack
Facile
Evolutif
Hello World
package   MyApp ; use   Dancer; get   '/'   =>   sub   { 'Hello FPW 2010!' }; dance;
serveur web  embarqué
$ ./myApp.pl >> Listening on 127.0.0.1:3000 == Entering the development dance floor ...
Créer une application
Génération d'un squellette $  dancer -a  WebApp + WebApp/app.psgi + WebApp/config.yml + WebApp/environments [...] + WebApp/lib/WebApp.pm + WebApp/views + WebApp/views/index.tt [...] + WebApp/WebApp.pl + WebApp/t/002_index_route.t + WebApp/t/001_base.t + WebApp/Makefile.PL
Layout CPAN-friendly
Dancer::Test use Test::More tests => 3; use WebApp; use Dancer::Test; route_exists  [GET => '/']; response_status_is  ['GET' => '/'], 200;
Application pré-configurée config.yml environments/development.yml environments/production.yml
# config.yml layout: 'application' foo: 42 content_type: 'text/plain'
config.yml = Configuration globale
development.yml warnings: 1 show_errors: 1 auto_reload: 1
production.yml warnings: 0 show_errors: 0 auto_reload: 0
$ ./WebApp.pl -e production Démarre l'application avec l'environnement « production »
Ready to rock!
Les  route handlers
méthode HTTP
+ path
+ sub { }
get '/' => sub {  ... };
get  '/' => sub {  ... };
get  '/'  => sub {  ... };
get '/' =>  sub {  ... } ;
/foo /bar/:var /baz/* r('/stuff/([a-z0-9]+)/')
/foo /bar/:var /baz/* r('/stuff/([a-z0-9]+)/') qr{/stuff/([a-z0-9]+)/}  NEW
Chemins statiques / /foo /bar/baz
Chemins avec tokens /hello/:buddy my $name = params->{buddy}
Chemins avec jokers /show/*.* my ($file, $ext) = splat;
Chemins avec expressions réguliÚres r('/post/([a-z0-9]+)') my ($post) = splat; # $1
Dancer est  un aiguilleur
Vers le bon  route handler
404 Si aucun ne correspond
$appdir/public
Route handler trouvé,  Execution de son code
Un seul objectif
La réponse
Contenu get '/showme' => sub { template  'showme', {  var => 'foo'}; };
Headers get '/' => sub { headers  'X-MyHead1' => 42; ... };
RequĂȘte get '/' => sub { my $path =  request ->path; my @uploads =  request ->uploads(); my $h1 =  request ->header('X-MyHead1'); ... };
Passer get '/lazy' => sub { pass ; };
Servir un fichier get '/dowload/:file' => sub { my $file = params->{file}; send_file $file; };
Déclencher une erreur get '/forbidden' => sub { send_error 'Nope'; };
Rediriger get '/forbidden' => sub { redirect '/better/place'; };
valeur de retour = contenu de la réponse
Fonctionnalités Avancées
Logs
Usage get '/' => sub { debug  'poupoutte' ; warning  'a warning' ; error  'an error' ; };
Configuration log  : core|debug|warning|error logger  : file|console|...
sukria@razor:/tmp/WebApp$ ./WebApp.pl  [28877]  core  @0.000011> loading application WebApp in ./WebApp.pl l. 3 [28877]  core  @0.002561> loading Standalone handler in /usr/local/share/perl/5.10.1/Dancer.pm l. 193 [28877]  core  @0.000054> request: GET / in /usr/local/share/perl/5.10.1/Dancer/Handler/Standalone.pm l. 39 [28877]  debug  @0.000326> [hit #1] a debug in /tmp/WebApp/lib/WebApp.pm l. 7
Logger engines Dancer::Logger::File Dancer::Logger::Console Dancer::Logger::Syslog Dancer::Logger::LogHandler ...
Sessions
Interface universelle
Ecrire post '/login' => sub { ... if ($user) { session  'user' => $user; } };
Lire get '/home' => sub { ... unless ( session ('user')) { return redirect '/login'; } };
Session engines Dancer::Session::Simple Dancer::Session::YAML Dancer::Session::Memcache Dancer::Session::Storable Dancer::Session::Cookie ...
Filtres
Initialiser un contexte before  sub {  var 'foo' => 42; var 'dbh' =>  DBI->connect(...); };
Stopper l'execution before  sub {  ... return  halt ('stop here'); };
ContrÎles systématiques before  sub {  if (not session('user')) { redirect '/login'; } };
Serializers
Valeur de retour Serialisée set serializer => 'JSON';
get => '/user/:id' => sub { ... return { user => $user }; };
Sans serializer $ curl http://0:3000/user/42 HASH(0x295d568)
Avec serializer $ curl http://0:3000/user/42 {"name":"Larry Wall","id":42}
Serializer engines Dancer::Serializer::JSON Dancer::Serializer::YAML Dancer::Serializer::Dumper Dancer::Serializer::Mutable
Plugins
Enrichir la syntaxe
Design patterns
use Dancer::Plugin:: Database ; get '/' =>sub { ... my $sth =  database ->prepare(...); };
Ecrire un plugin
package Dancer::Plugin::FPW2010;  use Dancer::Plugin; register ' add_fpw2010_route ' => sub { get '/fpw2010' => sub {  'Bonjour FPW 2010 !'   }; }; register_plugin;
Deja plusieurs plugins sur CPAN Dancer::Plugin::Validation Dancer::Plugin::Database Dancer::Plugin::REST Dancer::Plugin::Email ...
Déploiement
Pour déployer Dancer  PSGI/Plack
Plack - Perl Rack - Ruby WSGI - Python
Adaptateur universel serveur / application
app.psgi connecteur Plack
$ plackup -a app.psgi &
Tous les serveurs web ont des adaptateurs PSGI
Apache (mod_psgi) Nginx Starman Perlbal HTTP::Server::PSGI HTTP::Server::Fast ...
Exemple Apache <Location /> SetHandler perl-script PerlResponseHandler Plack::Handler::Apache2 PerlSetVar psgi_app /path/to/app.psgi </Location>
CGI : dispatch.cgi FastCGI : dispatch.fcgi Plack::Handler::AnyEvent Plack::Handler::Starman Plack::Handler::* ...
EcosystĂšme
Dancer::Cookbook Dancer::Deployment Dancer::Template::Simple Dancer::Template::TemplateToolkit Dancer::Test Dancer::Session::YAML Dancer::Session::Simple  Dancer::Introduction Dancer::Template::Alloy Dancer::Template::TemplateSandbox Dancer::Template::Tenjin Task::Dancer Dancer::Plugin::Database Dancer::Template::HtmlTemplate Dancer::Logger::Syslog Dancer::Session::Storable Dancer::Plugin::REST Dancer::Plugin::Validation Dancer::Template::Tiny Dancer::Plugin::SiteMap Dancer::Plugin::Email Dancer::Template::Haml Dancer::Serializer::YAML Dancer::Template::Mason Dancer::Session::Memcache Dancer::Template::MicroTemplate Dancer::Session::Memcache Dancer::Session::Cookie Dancer::Serializer::XML Dancer::Serializer::Mutable Dancer::Serializer::JSON Dancer::Logger::LogHandler ...
GitHub 30 forks 130 followers
+50 distributions +10 auteurs
Communauté irc.perl.org/#dancer [email_address]
Docs  Dancer Dancer::Introduction Dancer::Cookbook Dancer::Deployment ...
http://perldancer.org

Perl Dancer, FPW 2010