SlideShare une entreprise Scribd logo
1  sur  44
Dancing Tutorial

Alberto Manuel Brand˜o Sim˜es
                    a     o
        ambs@perl.pt


      Braga Geek Nights
          March 1st




    Alberto Sim˜es
               o     Dancing Tutorial
Part 0: Ballet




                 Alberto Sim˜es
                            o     Dancing Tutorial
What’s Dancer?
A micro framework
for writing web applications
So, Yet Another Web Framework?
Well, yes!
CGI.pm webapps are spaghetti
Catalyst is HUGE
Ruby introduced something different
We needed something similar in Perl
Definitely
And they also imitated us!
Available at
http://perldancer.org
     and in GitHub.
Part 1: Tango




                Alberto Sim˜es
                           o     Dancing Tutorial
Installing



  §                                                        ¤
       $ sudo cpan Dancer
  ¦                                                        ¥
  or
  §                                                        ¤
       $ sudo cpan Task : : Dancer
  ¦                                                        ¥
  or yet
  §                                                        ¤
       $ cpanm −S Task : : Dancer
  ¦                                                        ¥




                       Alberto Sim˜es
                                  o     Dancing Tutorial
Bootstrap application
 §                                                           ¤
      $   dancer −a MyApp
      +   MyApp / bin / app . pl
      +   MyApp / config . yml
      +   MyApp / environments / development . yml
      +   MyApp / environments / production . yml
      +   MyApp / views / index . tt
      +   MyApp / views / layouts / main . tt
      +   MyApp / lib / MyApp . pm
      +   MyApp / public / javascripts / jquery . js
      +   MyApp / public / css / style . css
      +   MyApp / public / css / error . css
      +   MyApp / public / images / . . .
      +   MyApp / public / 5 0 0 . html
      +   MyApp / public / 4 0 4 . html
      +   MyApp / public / dispatch . fcgi
      +   MyApp / public / dispatch . cgi
      +   MyApp / Makefile . PL
      +   MyApp /t /002 _index_route . t
      +   MyApp /t /001 _base . t
 ¦                                                           ¥
                         Alberto Sim˜es
                                    o     Dancing Tutorial
What’s inside

 §                                                              ¤
      + MyApp / bin / app . pl
 ¦                                                              ¥

      a standalone light server (starts server in port 3000);
      also used for fast-cgi or common cgi backends;

 §                                                              ¤
      + MyApp / config . yml
      + MyApp / environments / development . yml
      + MyApp / environments / production . yml
 ¦                                                              ¥

      main configuration file (plugins, modules, etc);
      configuration files for production and development:
           defines what to report, where to report, etc.



                         Alberto Sim˜es
                                    o     Dancing Tutorial
What’s inside

 §                                                              ¤
      + MyApp / bin / app . pl
 ¦                                                              ¥

      a standalone light server (starts server in port 3000);
      also used for fast-cgi or common cgi backends;

 §                                                              ¤
      + MyApp / config . yml
      + MyApp / environments / development . yml
      + MyApp / environments / production . yml
 ¦                                                              ¥

      main configuration file (plugins, modules, etc);
      configuration files for production and development:
           defines what to report, where to report, etc.



                         Alberto Sim˜es
                                    o     Dancing Tutorial
What’s inside
 §                                                              ¤
      + MyApp / views / index . tt
      + MyApp / views / layouts / main . tt
 ¦                                                              ¥
      Templates and layouts:
            templates are page portions/scraps;
            layouts are full page designs
            (they are automagically filled by the template);
 §                                                              ¤
      +   MyApp / public / javascripts / jquery . js
      +   MyApp / public / css / style . css
      +   MyApp / public / css / error . css
      +   MyApp / public / images / . . .
 ¦                                                              ¥

      public/static files:
            javascript (Dancer ships with jsquery);
            cascade style sheets;
            images (for default design);

                            Alberto Sim˜es
                                       o     Dancing Tutorial
What’s inside
 §                                                              ¤
      + MyApp / views / index . tt
      + MyApp / views / layouts / main . tt
 ¦                                                              ¥
      Templates and layouts:
            templates are page portions/scraps;
            layouts are full page designs
            (they are automagically filled by the template);
 §                                                              ¤
      +   MyApp / public / javascripts / jquery . js
      +   MyApp / public / css / style . css
      +   MyApp / public / css / error . css
      +   MyApp / public / images / . . .
 ¦                                                              ¥

      public/static files:
            javascript (Dancer ships with jsquery);
            cascade style sheets;
            images (for default design);

                            Alberto Sim˜es
                                       o     Dancing Tutorial
What’s inside

 §                                                            ¤
      + MyApp / public / 5 0 0 . html
      + MyApp / public / 4 0 4 . html
 ¦                                                            ¥

      pages for 500 and 404 errors;


 §                                                            ¤
      + MyApp / public / dispatch . fcgi
      + MyApp / public / dispatch . cgi
 ¦                                                            ¥
      wrappers to configure fast-cgi and cgi backends;
           will be back on this later (future talk?);




                          Alberto Sim˜es
                                     o     Dancing Tutorial
What’s inside

 §                                                            ¤
      + MyApp / public / 5 0 0 . html
      + MyApp / public / 4 0 4 . html
 ¦                                                            ¥

      pages for 500 and 404 errors;


 §                                                            ¤
      + MyApp / public / dispatch . fcgi
      + MyApp / public / dispatch . cgi
 ¦                                                            ¥
      wrappers to configure fast-cgi and cgi backends;
           will be back on this later (future talk?);




                          Alberto Sim˜es
                                     o     Dancing Tutorial
What’s inside

 §                                                            ¤
      + MyApp / Makefile . PL
      + MyApp /t /002 _index_route . t
      + MyApp /t /001 _base . t
 ¦                                                            ¥
      Main module Makefile:
           usefull to make module of your application
      Your test suite;


 §                                                            ¤
      + MyApp / lib / MyApp . pm
 ¦                                                            ¥

      Your application!



                          Alberto Sim˜es
                                     o     Dancing Tutorial
What’s inside

 §                                                            ¤
      + MyApp / Makefile . PL
      + MyApp /t /002 _index_route . t
      + MyApp /t /001 _base . t
 ¦                                                            ¥
      Main module Makefile:
           usefull to make module of your application
      Your test suite;


 §                                                            ¤
      + MyApp / lib / MyApp . pm
 ¦                                                            ¥

      Your application!



                          Alberto Sim˜es
                                     o     Dancing Tutorial
Part 2: Flamenco




                   Alberto Sim˜es
                              o     Dancing Tutorial
Traffic Control



  Your MyApp/lib/MyApp.pm includes:
 §                                                                 ¤
  p a c k a g e MyApp ;
  u s e Dancer ’ : s y n t a x ’ ;

  our $VERSION = ’ 0 . 1 ’ ;

  get ’ / ’ => sub {
      template ’ i n d e x ’ ;
  };

  true ;
 ¦                                                                 ¥




                               Alberto Sim˜es
                                          o     Dancing Tutorial
How to test it?

  Start the standalone server,
 §                                                                                                  ¤
  [ ambs@rachmaninoff MyApp ] $ bin / app . pl
 ¦                                                                                                  ¥



  that shows debug info,
 §                                                                                                  ¤
  [ 9 3 8 7 ] core @0 .000017 > loading Dancer : : Handler : : Standalone
  handler in / opt / lib / perl5 / site_perl / 5 . 1 2 . 3 / Dancer / Handler . pm l . 39
  [ 9 3 8 7 ] core @0 .000442 > loading handler ’ Dancer : : Handler : :
  Standalone ’ in / opt / l o c a l / lib / perl5 / site_perl / 5 . 1 2 . 3 / Dancer . pm l . 230
  >> Dancer 1 . 3 0 1 1 server 9387 listening on http : / / 0 . 0 . 0 . 0 : 3 0 0 0
   subsection { Entering the development dance floor . . . }
 ¦                                                                                                  ¥



  and open a browser in the specified port.


                                       Alberto Sim˜es
                                                  o         Dancing Tutorial
It Works!
Route Handlers


     A Dancer app is a collection of route handlers;
     A route handler is, basically, a sub;
     It is bound to an http method;
     And to a path or a path pattern;

  Example

        get ’ / ’ => sub { . . .            };

        post ’ / s u b m i t / : f i l e ’ => sub { . . .            };

        del ’ / r e s o u r c e /∗ ’ => sub { . . .             };




                           Alberto Sim˜es
                                      o          Dancing Tutorial
Route Handlers


     A Dancer app is a collection of route handlers;
     A route handler is, basically, a sub;
     It is bound to an http method;
     And to a path or a path pattern;

  Example

        get ’ / ’ => sub { . . .            };

        post ’ / s u b m i t / : f i l e ’ => sub { . . .            };

        del ’ / r e s o u r c e /∗ ’ => sub { . . .             };




                           Alberto Sim˜es
                                      o          Dancing Tutorial
Route Handlers

     Static patterns (paths):
     §                                                                     ¤
          get ’ / ’ => sub { . . .        };

          get ’ / a b o u t ’ => sub { . . .       };
     ¦                                                                     ¥
     Patterns with named tokens:
     §                                                                     ¤
          get ’ / book / : i d ’ => sub {
             # do s o m e t h i n g w i t h params −>{i d }
             ...
          };

          get ’ / u s e r / : g r o u p / : u i d ’ => sub {
             # u s e params −>{u i d } and params −>{g r o u p } h e r e
          };
     ¦                                                                     ¥



                         Alberto Sim˜es
                                    o     Dancing Tutorial
Route Handlers

     Static patterns (paths):
     §                                                                     ¤
          get ’ / ’ => sub { . . .        };

          get ’ / a b o u t ’ => sub { . . .       };
     ¦                                                                     ¥
     Patterns with named tokens:
     §                                                                     ¤
          get ’ / book / : i d ’ => sub {
             # do s o m e t h i n g w i t h params −>{i d }
             ...
          };

          get ’ / u s e r / : g r o u p / : u i d ’ => sub {
             # u s e params −>{u i d } and params −>{g r o u p } h e r e
          };
     ¦                                                                     ¥



                         Alberto Sim˜es
                                    o     Dancing Tutorial
Route Handlers

     Patterns with anonymous tokens:
     §                                                     ¤
         get ’ / f i l e / ∗ . ∗ ’ => sub {
           my ( $file , $ext ) = splat ;
           ...
         }

          get ’ / show /∗/∗ ’ => sub {
             my ( $cat , $subcat ) = splat ;
          };
     ¦                                                     ¥
     Regular expressions:
     §                                                     ¤
         get qr { post / (  d+)−(d+)−(d+)} => sub {
            my ( $year , $month , $day ) = splat ;
         }
     ¦                                                     ¥



                       Alberto Sim˜es
                                  o     Dancing Tutorial
Route Handlers

     Patterns with anonymous tokens:
     §                                                     ¤
         get ’ / f i l e / ∗ . ∗ ’ => sub {
           my ( $file , $ext ) = splat ;
           ...
         }

          get ’ / show /∗/∗ ’ => sub {
             my ( $cat , $subcat ) = splat ;
          };
     ¦                                                     ¥
     Regular expressions:
     §                                                     ¤
         get qr { post / (  d+)−(d+)−(d+)} => sub {
            my ( $year , $month , $day ) = splat ;
         }
     ¦                                                     ¥



                       Alberto Sim˜es
                                  o     Dancing Tutorial
Part 3: Mambo




                Alberto Sim˜es
                           o     Dancing Tutorial
Templating



  Dancer has plugins for most templating systems:
      Mason, Template Toolkit and others.
      Default is a Simple template system, built-in Dancer.

  Use the template inside the route:
 §                                                                  ¤
      get ’ / u s e r / : name ’ => sub {
         template ’ p r o f i l e ’ => { username => params−>{name } } ;
      };
 ¦                                                                  ¥




                        Alberto Sim˜es
                                   o     Dancing Tutorial
Templating



  Dancer has plugins for most templating systems:
      Mason, Template Toolkit and others.
      Default is a Simple template system, built-in Dancer.

  Use the template inside the route:
 §                                                                  ¤
      get ’ / u s e r / : name ’ => sub {
         template ’ p r o f i l e ’ => { username => params−>{name } } ;
      };
 ¦                                                                  ¥




                        Alberto Sim˜es
                                   o     Dancing Tutorial
Rerouting


  You can reroute by:

  Passing the control to the next matching handler:
 §                                                               ¤
      get ’ / l a z y ’ => sub {
         pass and r e t u r n false ;
      };
 ¦                                                               ¥

  Redirecting to other URI:
 §                                                               ¤
      get ’ / f o r b i d d e n ’ => sub {
         r e t u r n redirect ’ / b e t t e r / p l a c e ’
      };
 ¦                                                               ¥




                             Alberto Sim˜es
                                        o     Dancing Tutorial
Rerouting


  You can reroute by:

  Passing the control to the next matching handler:
 §                                                               ¤
      get ’ / l a z y ’ => sub {
         pass and r e t u r n false ;
      };
 ¦                                                               ¥

  Redirecting to other URI:
 §                                                               ¤
      get ’ / f o r b i d d e n ’ => sub {
         r e t u r n redirect ’ / b e t t e r / p l a c e ’
      };
 ¦                                                               ¥




                             Alberto Sim˜es
                                        o     Dancing Tutorial
Rerouting


  You can reroute by:

  Passing the control to the next matching handler:
 §                                                               ¤
      get ’ / l a z y ’ => sub {
         pass and r e t u r n false ;
      };
 ¦                                                               ¥

  Redirecting to other URI:
 §                                                               ¤
      get ’ / f o r b i d d e n ’ => sub {
         r e t u r n redirect ’ / b e t t e r / p l a c e ’
      };
 ¦                                                               ¥




                             Alberto Sim˜es
                                        o     Dancing Tutorial
Serving Files

  You can serve a static file:
 §                                                              ¤
       get ’ / dowload / : f i l e ’ => sub {
         my $file = params−>{file } ;

            pass and r e t u r n false u n l e s s −f $file ;

            send_file $file ;
       };
 ¦                                                              ¥

  If the content is generated, just change content-type:
 §                                                              ¤
       get ’ / readme . t x t ’ => sub {
          content_type ’ t e x t / p l a i n ’ ;
          return ’ this is plain text ’
       };
 ¦                                                              ¥


                            Alberto Sim˜es
                                       o     Dancing Tutorial
Serving Files

  You can serve a static file:
 §                                                              ¤
       get ’ / dowload / : f i l e ’ => sub {
         my $file = params−>{file } ;

            pass and r e t u r n false u n l e s s −f $file ;

            send_file $file ;
       };
 ¦                                                              ¥

  If the content is generated, just change content-type:
 §                                                              ¤
       get ’ / readme . t x t ’ => sub {
          content_type ’ t e x t / p l a i n ’ ;
          return ’ this is plain text ’
       };
 ¦                                                              ¥


                            Alberto Sim˜es
                                       o     Dancing Tutorial
Thanks to Alexis Sukrieh
  (I stole some slides)

Contenu connexe

Tendances

優しいWAFの作り方
優しいWAFの作り方優しいWAFの作り方
優しいWAFの作り方
techmemo
 
Interface de Voz con Rails
Interface de Voz con RailsInterface de Voz con Rails
Interface de Voz con Rails
Svet Ivantchev
 
Task 1
Task 1Task 1
Task 1
EdiPHP
 
jQuery Plugin Creation
jQuery Plugin CreationjQuery Plugin Creation
jQuery Plugin Creation
benalman
 

Tendances (20)

Quality Use Of Plugin
Quality Use Of PluginQuality Use Of Plugin
Quality Use Of Plugin
 
How to develop modern web application framework
How to develop modern web application frameworkHow to develop modern web application framework
How to develop modern web application framework
 
優しいWAFの作り方
優しいWAFの作り方優しいWAFの作り方
優しいWAFの作り方
 
Micropage in microtime using microframework
Micropage in microtime using microframeworkMicropage in microtime using microframework
Micropage in microtime using microframework
 
Using Buildout to Develop and Deploy Python Projects
Using Buildout to Develop and Deploy Python ProjectsUsing Buildout to Develop and Deploy Python Projects
Using Buildout to Develop and Deploy Python Projects
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
 
Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3Introducing Assetic: Asset Management for PHP 5.3
Introducing Assetic: Asset Management for PHP 5.3
 
Interface de Voz con Rails
Interface de Voz con RailsInterface de Voz con Rails
Interface de Voz con Rails
 
Engines
EnginesEngines
Engines
 
I motion
I motionI motion
I motion
 
RESTful web services
RESTful web servicesRESTful web services
RESTful web services
 
JSON and the APInauts
JSON and the APInautsJSON and the APInauts
JSON and the APInauts
 
Task 1
Task 1Task 1
Task 1
 
Introduction to CoffeeScript
Introduction to CoffeeScriptIntroduction to CoffeeScript
Introduction to CoffeeScript
 
Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!
 
Magical WordPress Development with Vagrant
Magical WordPress Development with VagrantMagical WordPress Development with Vagrant
Magical WordPress Development with Vagrant
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Contributing to WordPress Core - Peter Wilson
Contributing to WordPress Core - Peter WilsonContributing to WordPress Core - Peter Wilson
Contributing to WordPress Core - Peter Wilson
 
jQuery Plugin Creation
jQuery Plugin CreationjQuery Plugin Creation
jQuery Plugin Creation
 
FizzBuzzではじめるテスト
FizzBuzzではじめるテストFizzBuzzではじめるテスト
FizzBuzzではじめるテスト
 

Similaire à Dancer tutorial | Perl

Troubleshooting Plone
Troubleshooting PloneTroubleshooting Plone
Troubleshooting Plone
Ricado Alves
 
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
Fabien Potencier
 

Similaire à Dancer tutorial | Perl (20)

Generic Setup De-Mystified
Generic Setup De-MystifiedGeneric Setup De-Mystified
Generic Setup De-Mystified
 
Merb Slices
Merb SlicesMerb Slices
Merb Slices
 
Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!Rapid Prototyping FTW!!!
Rapid Prototyping FTW!!!
 
Buildout: Fostering Repeatability
Buildout: Fostering RepeatabilityBuildout: Fostering Repeatability
Buildout: Fostering Repeatability
 
Shoes lightning
Shoes lightningShoes lightning
Shoes lightning
 
Advanced Topics in Continuous Deployment
Advanced Topics in Continuous DeploymentAdvanced Topics in Continuous Deployment
Advanced Topics in Continuous Deployment
 
5 best practices for (web/ software) development (2010)
5 best practices for (web/ software) development (2010)5 best practices for (web/ software) development (2010)
5 best practices for (web/ software) development (2010)
 
An Introduction To Shoes
An Introduction To ShoesAn Introduction To Shoes
An Introduction To Shoes
 
Troubleshooting Plone
Troubleshooting PloneTroubleshooting Plone
Troubleshooting Plone
 
Hacking Movable Type Training - Day 1
Hacking Movable Type Training - Day 1Hacking Movable Type Training - Day 1
Hacking Movable Type Training - Day 1
 
Sinatra
SinatraSinatra
Sinatra
 
Elixir on Containers
Elixir on ContainersElixir on Containers
Elixir on Containers
 
Abusing the Cloud for Fun and Profit
Abusing the Cloud for Fun and ProfitAbusing the Cloud for Fun and Profit
Abusing the Cloud for Fun and Profit
 
Makefiles in 2020 — Why they still matter
Makefiles in 2020 — Why they still matterMakefiles in 2020 — Why they still matter
Makefiles in 2020 — Why they still matter
 
Pyramid Lighter/Faster/Better web apps
Pyramid Lighter/Faster/Better web appsPyramid Lighter/Faster/Better web apps
Pyramid Lighter/Faster/Better web apps
 
Fisl 11 - Dicas de Desenvolvimento Web com Ruby
Fisl 11 - Dicas de Desenvolvimento Web com RubyFisl 11 - Dicas de Desenvolvimento Web com Ruby
Fisl 11 - Dicas de Desenvolvimento Web com Ruby
 
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
symfony: An Open-Source Framework for Professionals (Dutch Php Conference 2008)
 
Monitoring web application behaviour with cucumber-nagios
Monitoring web application behaviour with cucumber-nagiosMonitoring web application behaviour with cucumber-nagios
Monitoring web application behaviour with cucumber-nagios
 
Bubbles & Trees with jQuery
Bubbles & Trees with jQueryBubbles & Trees with jQuery
Bubbles & Trees with jQuery
 
Consegi 2010 - Dicas de Desenvolvimento Web com Ruby
Consegi 2010 - Dicas de Desenvolvimento Web com RubyConsegi 2010 - Dicas de Desenvolvimento Web com Ruby
Consegi 2010 - Dicas de Desenvolvimento Web com Ruby
 

Dancer tutorial | Perl

  • 1. Dancing Tutorial Alberto Manuel Brand˜o Sim˜es a o ambs@perl.pt Braga Geek Nights March 1st Alberto Sim˜es o Dancing Tutorial
  • 2. Part 0: Ballet Alberto Sim˜es o Dancing Tutorial
  • 4. A micro framework for writing web applications
  • 5. So, Yet Another Web Framework?
  • 7. CGI.pm webapps are spaghetti
  • 10.
  • 11. We needed something similar in Perl
  • 13. And they also imitated us!
  • 15. Part 1: Tango Alberto Sim˜es o Dancing Tutorial
  • 16. Installing § ¤ $ sudo cpan Dancer ¦ ¥ or § ¤ $ sudo cpan Task : : Dancer ¦ ¥ or yet § ¤ $ cpanm −S Task : : Dancer ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 17. Bootstrap application § ¤ $ dancer −a MyApp + MyApp / bin / app . pl + MyApp / config . yml + MyApp / environments / development . yml + MyApp / environments / production . yml + MyApp / views / index . tt + MyApp / views / layouts / main . tt + MyApp / lib / MyApp . pm + MyApp / public / javascripts / jquery . js + MyApp / public / css / style . css + MyApp / public / css / error . css + MyApp / public / images / . . . + MyApp / public / 5 0 0 . html + MyApp / public / 4 0 4 . html + MyApp / public / dispatch . fcgi + MyApp / public / dispatch . cgi + MyApp / Makefile . PL + MyApp /t /002 _index_route . t + MyApp /t /001 _base . t ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 18. What’s inside § ¤ + MyApp / bin / app . pl ¦ ¥ a standalone light server (starts server in port 3000); also used for fast-cgi or common cgi backends; § ¤ + MyApp / config . yml + MyApp / environments / development . yml + MyApp / environments / production . yml ¦ ¥ main configuration file (plugins, modules, etc); configuration files for production and development: defines what to report, where to report, etc. Alberto Sim˜es o Dancing Tutorial
  • 19. What’s inside § ¤ + MyApp / bin / app . pl ¦ ¥ a standalone light server (starts server in port 3000); also used for fast-cgi or common cgi backends; § ¤ + MyApp / config . yml + MyApp / environments / development . yml + MyApp / environments / production . yml ¦ ¥ main configuration file (plugins, modules, etc); configuration files for production and development: defines what to report, where to report, etc. Alberto Sim˜es o Dancing Tutorial
  • 20. What’s inside § ¤ + MyApp / views / index . tt + MyApp / views / layouts / main . tt ¦ ¥ Templates and layouts: templates are page portions/scraps; layouts are full page designs (they are automagically filled by the template); § ¤ + MyApp / public / javascripts / jquery . js + MyApp / public / css / style . css + MyApp / public / css / error . css + MyApp / public / images / . . . ¦ ¥ public/static files: javascript (Dancer ships with jsquery); cascade style sheets; images (for default design); Alberto Sim˜es o Dancing Tutorial
  • 21. What’s inside § ¤ + MyApp / views / index . tt + MyApp / views / layouts / main . tt ¦ ¥ Templates and layouts: templates are page portions/scraps; layouts are full page designs (they are automagically filled by the template); § ¤ + MyApp / public / javascripts / jquery . js + MyApp / public / css / style . css + MyApp / public / css / error . css + MyApp / public / images / . . . ¦ ¥ public/static files: javascript (Dancer ships with jsquery); cascade style sheets; images (for default design); Alberto Sim˜es o Dancing Tutorial
  • 22. What’s inside § ¤ + MyApp / public / 5 0 0 . html + MyApp / public / 4 0 4 . html ¦ ¥ pages for 500 and 404 errors; § ¤ + MyApp / public / dispatch . fcgi + MyApp / public / dispatch . cgi ¦ ¥ wrappers to configure fast-cgi and cgi backends; will be back on this later (future talk?); Alberto Sim˜es o Dancing Tutorial
  • 23. What’s inside § ¤ + MyApp / public / 5 0 0 . html + MyApp / public / 4 0 4 . html ¦ ¥ pages for 500 and 404 errors; § ¤ + MyApp / public / dispatch . fcgi + MyApp / public / dispatch . cgi ¦ ¥ wrappers to configure fast-cgi and cgi backends; will be back on this later (future talk?); Alberto Sim˜es o Dancing Tutorial
  • 24. What’s inside § ¤ + MyApp / Makefile . PL + MyApp /t /002 _index_route . t + MyApp /t /001 _base . t ¦ ¥ Main module Makefile: usefull to make module of your application Your test suite; § ¤ + MyApp / lib / MyApp . pm ¦ ¥ Your application! Alberto Sim˜es o Dancing Tutorial
  • 25. What’s inside § ¤ + MyApp / Makefile . PL + MyApp /t /002 _index_route . t + MyApp /t /001 _base . t ¦ ¥ Main module Makefile: usefull to make module of your application Your test suite; § ¤ + MyApp / lib / MyApp . pm ¦ ¥ Your application! Alberto Sim˜es o Dancing Tutorial
  • 26. Part 2: Flamenco Alberto Sim˜es o Dancing Tutorial
  • 27. Traffic Control Your MyApp/lib/MyApp.pm includes: § ¤ p a c k a g e MyApp ; u s e Dancer ’ : s y n t a x ’ ; our $VERSION = ’ 0 . 1 ’ ; get ’ / ’ => sub { template ’ i n d e x ’ ; }; true ; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 28. How to test it? Start the standalone server, § ¤ [ ambs@rachmaninoff MyApp ] $ bin / app . pl ¦ ¥ that shows debug info, § ¤ [ 9 3 8 7 ] core @0 .000017 > loading Dancer : : Handler : : Standalone handler in / opt / lib / perl5 / site_perl / 5 . 1 2 . 3 / Dancer / Handler . pm l . 39 [ 9 3 8 7 ] core @0 .000442 > loading handler ’ Dancer : : Handler : : Standalone ’ in / opt / l o c a l / lib / perl5 / site_perl / 5 . 1 2 . 3 / Dancer . pm l . 230 >> Dancer 1 . 3 0 1 1 server 9387 listening on http : / / 0 . 0 . 0 . 0 : 3 0 0 0 subsection { Entering the development dance floor . . . } ¦ ¥ and open a browser in the specified port. Alberto Sim˜es o Dancing Tutorial
  • 30. Route Handlers A Dancer app is a collection of route handlers; A route handler is, basically, a sub; It is bound to an http method; And to a path or a path pattern; Example get ’ / ’ => sub { . . . }; post ’ / s u b m i t / : f i l e ’ => sub { . . . }; del ’ / r e s o u r c e /∗ ’ => sub { . . . }; Alberto Sim˜es o Dancing Tutorial
  • 31. Route Handlers A Dancer app is a collection of route handlers; A route handler is, basically, a sub; It is bound to an http method; And to a path or a path pattern; Example get ’ / ’ => sub { . . . }; post ’ / s u b m i t / : f i l e ’ => sub { . . . }; del ’ / r e s o u r c e /∗ ’ => sub { . . . }; Alberto Sim˜es o Dancing Tutorial
  • 32. Route Handlers Static patterns (paths): § ¤ get ’ / ’ => sub { . . . }; get ’ / a b o u t ’ => sub { . . . }; ¦ ¥ Patterns with named tokens: § ¤ get ’ / book / : i d ’ => sub { # do s o m e t h i n g w i t h params −>{i d } ... }; get ’ / u s e r / : g r o u p / : u i d ’ => sub { # u s e params −>{u i d } and params −>{g r o u p } h e r e }; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 33. Route Handlers Static patterns (paths): § ¤ get ’ / ’ => sub { . . . }; get ’ / a b o u t ’ => sub { . . . }; ¦ ¥ Patterns with named tokens: § ¤ get ’ / book / : i d ’ => sub { # do s o m e t h i n g w i t h params −>{i d } ... }; get ’ / u s e r / : g r o u p / : u i d ’ => sub { # u s e params −>{u i d } and params −>{g r o u p } h e r e }; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 34. Route Handlers Patterns with anonymous tokens: § ¤ get ’ / f i l e / ∗ . ∗ ’ => sub { my ( $file , $ext ) = splat ; ... } get ’ / show /∗/∗ ’ => sub { my ( $cat , $subcat ) = splat ; }; ¦ ¥ Regular expressions: § ¤ get qr { post / ( d+)−(d+)−(d+)} => sub { my ( $year , $month , $day ) = splat ; } ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 35. Route Handlers Patterns with anonymous tokens: § ¤ get ’ / f i l e / ∗ . ∗ ’ => sub { my ( $file , $ext ) = splat ; ... } get ’ / show /∗/∗ ’ => sub { my ( $cat , $subcat ) = splat ; }; ¦ ¥ Regular expressions: § ¤ get qr { post / ( d+)−(d+)−(d+)} => sub { my ( $year , $month , $day ) = splat ; } ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 36. Part 3: Mambo Alberto Sim˜es o Dancing Tutorial
  • 37. Templating Dancer has plugins for most templating systems: Mason, Template Toolkit and others. Default is a Simple template system, built-in Dancer. Use the template inside the route: § ¤ get ’ / u s e r / : name ’ => sub { template ’ p r o f i l e ’ => { username => params−>{name } } ; }; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 38. Templating Dancer has plugins for most templating systems: Mason, Template Toolkit and others. Default is a Simple template system, built-in Dancer. Use the template inside the route: § ¤ get ’ / u s e r / : name ’ => sub { template ’ p r o f i l e ’ => { username => params−>{name } } ; }; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 39. Rerouting You can reroute by: Passing the control to the next matching handler: § ¤ get ’ / l a z y ’ => sub { pass and r e t u r n false ; }; ¦ ¥ Redirecting to other URI: § ¤ get ’ / f o r b i d d e n ’ => sub { r e t u r n redirect ’ / b e t t e r / p l a c e ’ }; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 40. Rerouting You can reroute by: Passing the control to the next matching handler: § ¤ get ’ / l a z y ’ => sub { pass and r e t u r n false ; }; ¦ ¥ Redirecting to other URI: § ¤ get ’ / f o r b i d d e n ’ => sub { r e t u r n redirect ’ / b e t t e r / p l a c e ’ }; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 41. Rerouting You can reroute by: Passing the control to the next matching handler: § ¤ get ’ / l a z y ’ => sub { pass and r e t u r n false ; }; ¦ ¥ Redirecting to other URI: § ¤ get ’ / f o r b i d d e n ’ => sub { r e t u r n redirect ’ / b e t t e r / p l a c e ’ }; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 42. Serving Files You can serve a static file: § ¤ get ’ / dowload / : f i l e ’ => sub { my $file = params−>{file } ; pass and r e t u r n false u n l e s s −f $file ; send_file $file ; }; ¦ ¥ If the content is generated, just change content-type: § ¤ get ’ / readme . t x t ’ => sub { content_type ’ t e x t / p l a i n ’ ; return ’ this is plain text ’ }; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 43. Serving Files You can serve a static file: § ¤ get ’ / dowload / : f i l e ’ => sub { my $file = params−>{file } ; pass and r e t u r n false u n l e s s −f $file ; send_file $file ; }; ¦ ¥ If the content is generated, just change content-type: § ¤ get ’ / readme . t x t ’ => sub { content_type ’ t e x t / p l a i n ’ ; return ’ this is plain text ’ }; ¦ ¥ Alberto Sim˜es o Dancing Tutorial
  • 44. Thanks to Alexis Sukrieh (I stole some slides)