table of contents
Router::Simple(3pm) | User Contributed Perl Documentation | Router::Simple(3pm) |
NAME¶
Router::Simple - simple HTTP router
SYNOPSIS¶
use Router::Simple; my $router = Router::Simple->new(); $router->connect('/', {controller => 'Root', action => 'show'}); $router->connect('/blog/{year}/{month}', {controller => 'Blog', action => 'monthly'}); my $app = sub { my $env = shift; if (my $p = $router->match($env)) { # $p = { controller => 'Blog', action => 'monthly', ... } } else { [404, [], ['not found']]; } };
DESCRIPTION¶
Router::Simple is a simple router class.
Its main purpose is to serve as a dispatcher for web applications.
Router::Simple can match against PSGI $env directly, which means it's easy to use with PSGI supporting web frameworks.
HOW TO WRITE A ROUTING RULE¶
plain string¶
$router->connect( '/foo', { controller => 'Root', action => 'foo' } );
:name notation¶
$router->connect( '/wiki/:page', { controller => 'WikiPage', action => 'show' } ); ... $router->match('/wiki/john'); # => {controller => 'WikiPage', action => 'show', page => 'john' }
':name' notation matches "qr{([^/]+)}".
'*' notation¶
$router->connect( '/download/*.*', { controller => 'Download', action => 'file' } ); ... $router->match('/download/path/to/file.xml'); # => {controller => 'Download', action => 'file', splat => ['path/to/file', 'xml'] }
'*' notation matches "qr{(.+)}". You will get the captured argument as an array ref for the special key "splat".
'{year}' notation¶
$router->connect( '/blog/{year}', { controller => 'Blog', action => 'yearly' } ); ... $router->match('/blog/2010'); # => {controller => 'Blog', action => 'yearly', year => 2010 }
'{year}' notation matches "qr{([^/]+)}", and it will be captured.
'{year:[0-9]+}' notation¶
$router->connect( '/blog/{year:[0-9]+}/{month:[0-9]{2}}', { controller => 'Blog', action => 'monthly' } ); ... $router->match('/blog/2010/04'); # => {controller => 'Blog', action => 'monthly', year => 2010, month => '04' }
You can specify regular expressions in named captures.
regexp¶
$router->connect( qr{/blog/(\d+)/([0-9]{2})', { controller => 'Blog', action => 'monthly' } ); ... $router->match('/blog/2010/04'); # => {controller => 'Blog', action => 'monthly', splat => [2010, '04'] }
You can use Perl5's powerful regexp directly, and the captured values are stored in the special key "splat".
METHODS¶
- my $router = Router::Simple->new();
- Creates a new instance of Router::Simple.
- $router->method_not_allowed() : Boolean
- This method returns last "$router->match()" call is rejected by HTTP method or not.
- $router->connect([$name, ] $pattern, \%destination[, \%options])
- Adds a new rule to $router.
$router->connect( '/', { controller => 'Root', action => 'index' } ); $router->connect( 'show_entry', '/blog/:id', { controller => 'Blog', action => 'show' } ); $router->connect( '/blog/:id', { controller => 'Blog', action => 'show' } ); $router->connect( '/comment', { controller => 'Comment', action => 'new_comment' }, {method => 'POST'} );
"\%destination" will be used by match method.
You can specify some optional things to "\%options". The current version supports 'method', 'host', and 'on_match'.
- method
- 'method' is an ArrayRef[String] or String that matches REQUEST_METHOD in $req.
- host
- 'host' is a String or Regexp that matches HTTP_HOST in $req.
- on_match
-
$r->connect( '/{controller}/{action}/{id}', {}, { on_match => sub { my($env, $match) = @_; $match->{referer} = $env->{HTTP_REFERER}; return 1; } } );
A function that evaluates the request. Its signature must be "($environ, $match) => bool". It should return true if the match is successful or false otherwise. The first argument is $env which is either a PSGI environment or a request path, depending on what you pass to "match" method; the second is the routing variables that would be returned if the match succeeds.
The function can modify $env (in case it's a reference) and $match in place to affect which variables are returned. This allows a wide range of transformations.
- "$router->submapper($path, [\%dest, [\%opt]])"
-
$router->submapper('/entry/', {controller => 'Entry'})
This method is shorthand for creating new instance of Router::Simple::Submapper.
The arguments will be passed to "Router::Simple::SubMapper->new(%args)".
- "$match = $router->match($env|$path)"
- Matches a URL against one of the contained routes.
The parameter is either a PSGI $env or a plain string that represents a path.
This method returns a plain hashref that would look like:
{ controller => 'Blog', action => 'daily', year => 2010, month => '03', day => '04', }
It returns undef if no valid match is found.
- "my ($match, $route) = $router->routematch($env|$path);"
- Match a URL against one of the routes contained.
Will return undef if no valid match is found, otherwise a result hashref and a Router::Simple::Route object is returned.
- "$router->as_string()"
- Dumps $router as string.
Example output:
home GET / blog_monthly GET /blog/{year}/{month} GET /blog/{year:\d{1,4}}/{month:\d{2}}/{day:\d\d} POST /comment GET /
AUTHOR¶
Tokuhiro Matsuno <tokuhirom AAJKLFJEF@ GMAIL COM>
THANKS TO¶
Tatsuhiko Miyagawa
Shawn M Moore
routes.py <http://routes.groovie.org/>.
SEE ALSO¶
Router::Simple is inspired by routes.py <http://routes.groovie.org/>.
Path::Dispatcher is similar, but so complex.
Path::Router is heavy. It depends on Moose.
HTTP::Router has many dependencies. It is not well documented.
HTTPx::Dispatcher is my old one. It does not provide an OO-ish interface.
THANKS TO¶
DeNA
LICENSE¶
Copyright (C) Tokuhiro Matsuno
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
2015-04-13 | perl v5.40.0 |