Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
simple http router
Perl Perl6
Branch: master
Failed to load latest commit information.
author minil migrate
lib/Router
t add test and documentation
xt
.gitignore
Build.PL Checking in changes prior to tagging of version 0.16.
Changes
LICENSE Checking in changes prior to tagging of version 0.10.
META.json
README.md Checking in changes prior to tagging of version 0.16.
cpanfile minil migrate
minil.toml

README.md

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

THANKS TO

Tatsuhiko Miyagawa

Shawn M Moore

routes.py.

SEE ALSO

Router::Simple is inspired by routes.py.

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.

Something went wrong with that request. Please try again.