Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
simple http router
Perl Perl6
Tag: 0.02

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib/Router
t
tools
xt
.gitignore
.shipit
Changes
MANIFEST.SKIP
Makefile.PL
README.mkdn

README.mkdn

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)) {
        return "MyApp::C::$p->{controller}"->can($p->{action})->($env, $p->{args});
    } 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 is PSGI friendly.

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', args => { 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 'splat'.

'{year}' notation

$router->connect( '/blog/{year}', { controller => 'Blog', action => 'yearly' } );
...
$router->match('/blog/2010');
# => {controller => 'Blog', action => 'yearly', args => { year => 2010 } }

'{year}' notation matches qr{([^/]+)}, and it will be captured as 'args'.

'{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', args => { 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.

METHODS

  • my $router = Router::Simple->new();

Creates a new instance of Router::Simple.

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

You can specify the $destination as \%hashref or &coderef. The hashref should have keys named controller and action.

You can specify some optional things to \%options. The current version supports 'method' and 'host'. 'method' is an ArrayRef[String] or String that matches REQUEST_METHOD in $req. 'host' is a String or Regexp that matches HTTP_HOST in $req.

  • $router->submapper([$pathprefix, ] %args)

    $router->submapper('/entry/, controller => 'Entry') $router->submapper(path_prefix => '/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).

  • $router->match($req|$path)

Matches a URL against one of the contained routes.

$req is a PSGI $env or a plain string.

This method returns a plain hashref.

If you are using the +{ controller => 'Blog', action => 'daily' } style, then the value returned will look like:

{
    controller => 'Blog',
    action     => 'daily',
    args       => { year => 2010, month => '03', day => '04' },
}

If you are using a sub { ... } as the action, you will get the following:

{
    code => sub { 'DUMMY' },
    args => { year => 2010, month => '03', day => '04' },
}

This will return undef if no valid match is found.

  • $router->url_for($anchor, \%opts)

Generate a path string from the rule named $anchor.

You must pass each parameter in \%opts.

my $router = Router::Simple->new();
$router->connect('articles', '/article', {controller => 'Article', action => 'index'});
$router->connect('edit_articles', '/article/{id}', {controller => 'Article', action => 'edit'});
$router->url_for('articles'); # => /articles
$router->url_for('edit_articles', {id => 3}); # => /articles/3/edit
  • $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

THANKS TO

Tatsuhiko Miyagawa

Shawn M Moore

L.

SEE ALSO

Router::Simple is inspired by L.

Path::Dispatcher is similar, but so complex.

Path::Router is heavy. It depends on Moose.

HTTP::Router has many deps. It is not well documented.

HTTPx::Dispatcher is my old one. It does not provide an OOish 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.

Something went wrong with that request. Please try again.