NAME
Routes::Tiny - Routes
SYNOPSIS
my
$routes
= Routes::Tiny->new;
# Constraints
$routes
->add_route(
'/articles/:id'
,
constraints
=> {
id
=>
qr/\d+/
});
# Optional placeholders
$routes
->add_route(
'/archive/:year/(:month)?'
);
# Defaults
$routes
->add_route(
'/articles/:id'
,
defaults
=> {
controller
=>
'bar'
,
action
=>
'foo'
});
# Grouping (matches 'hello-bar')
$routes
->add_route(
'/(:foo)-bar'
);
# Globbing (matches 'photos/foo/bar/baz')
$routes
->add_route(
'/photos/*other'
);
# Path building
$routes
->add_route(
'/:foo/:bar'
,
name
=>
'default'
);
$routes
->build_path(
'default'
,
foo
=>
'hello'
,
bar
=>
'world'
);
# Matching
my
$match
=
$routes
->match(
'/hello/world'
);
my
$captures_hashref
=
$match
->captures;
# Matching with method
$routes
->add_route(
'/hello/world'
,
method
=>
'GET'
);
my
$match
=
$routes
->match(
'/hello/world'
,
method
=>
'GET'
);
# Subroutes
my
$subroutes
= Routes::Tiny->new;
$subroutes
->add_route(
'/article/:id'
);
$routes
->mount(
'/admin/'
,
$subroutes
);
DESCRIPTION
Routes::Tiny is a lightweight routes implementation.
Routes::Tiny aims to be easy to use in any web framework.
FEATURES
Constraints
$routes
->add_route(
'/articles/:id'
,
constraints
=> {
id
=>
qr/\d+/
});
$match
=
$routes
->match(
'/articles/1'
);
# Routes::Tiny::Match object
$match
=
$routes
->match(
'/article/foo'
);
# undef
It is possible to specify a constraint that a placeholder must match using a normal Perl regular expression.
Constraints can be passed as array references:
$routes
->add_route(
'/articles/:action'
,
constraints
=> {
action
=> [
qw/add update/
]});
$match
=
$routes
->match(
'/articles/add'
);
# Routes::Tiny::Match object
$match
=
$routes
->match(
'/articles/delete'
);
# undef
Optional placeholders
$routes
->add_route(
'/admin/:service(/:action)?'
,
defaults
=> {
action
=>
'list'
});
my
$match
=
$routes
->match(
'/admin/foo'
);
# $m->captures is {service => 'foo', action => 'list'}
It is possible to specify an optional placeholder with a default value.
Grouping
$routes
->add_route(
'/(:foo)-bar'
);
$match
=
$routes
->match(
'/hello-bar'
);
# $match->captures is {foo => 'hello'}
It is possible to create a placeholder that doesn't occupy all the space between slashes.
Globbing
$routes
->add_route(
'/photos/*other'
);
$routes
->add_route(
'/books/*section/:title'
);
$routes
->add_route(
'/*a/foo/*b'
);
$match
=
$routes
->match(
'photos/foo/bar/baz'
);
# $match->captures is {other => 'foo/bar/baz'}
$match
=
$routes
->match(
'books/some/section/last-words-a-memoir'
);
# $match->captures is {section => 'some/section', title => 'last-words-a-memoir'}
$match
=
$routes
->match(
'zoo/woo/foo/bar/baz'
);
# $match->captures is {a => 'zoo/woo', b => 'bar/baz'}
It is possible to specify a globbing placeholder.
Passing arguments AS IS
$routes
->add_route(
'/'
,
arguments
=> {
one
=>
'two'
});
$match
=
$routes
->match(
'/'
);
# $match->arguments is {one => 'two'}
It is possible to pass arguments to the match object AS IS.
Matching with methods
# Exact HTTP method definition
$routes
->add_route(
'/articles'
,
method
=>
'GET'
,
defaults
=> {
action
=>
'list'
});
# Sweeter method definition
# METHOD => PATTERN should go as first parameters to add_route()
$routes
->add_route(
PUT
=>
'/articles'
,
defaults
=> {
action
=>
'create'
});
$match
=
$routes
->match(
'/articles'
,
method
=>
'GET'
);
# $m->captures is {action => 'list'}
$match
=
$routes
->match(
'/articles'
,
method
=>
'PUT'
);
# $m->captures is {action => 'create'}
Subroutes
$subroutes
= Routes::Tiny->new;
$subroutes
->add_route(
'/articles/:id'
,
name
=>
'admin-article'
);
$routes
->mount(
'/admin/'
,
$subroutes
);
$match
=
$routes
->match(
'/admin/articles/3/'
);
# $match->captures is {id => 3}
It is possible to capture params in mount routes
$subroutes
= Routes::Tiny->new;
$subroutes
->add_route(
'/comments/:page/'
,
name
=>
'comments'
);
$routes
->mount(
'/:type/:id/'
,
$subroutes
);
$match
=
$routes
->match(
'/articles/3/comments/5/'
);
# $match->captures is {page => 5}
# $match->parent->captures is {type => 'articles', id => 3}
Parent routes mounts names of children routes, so it's possible to buil path
$path
=
$routes
->build_path(
'admin-article'
,
id
=> 123);
# $path is '/admin/articles/123'
$path
=
$routes
->build_path(
'comments'
,
type
=>
'articles'
,
id
=> 123,
page
=> 5);
# $path is '/articles/123/comments/5/'
Path building
$routes
->add_route(
'/articles/:id'
,
name
=>
'article'
);
$path
=
$routes
->build_path(
'article'
,
id
=> 123);
# $path is '/articles/123'
It is possible to reconstruct a path from route's name and parameters.
WARNINGS
Trailing slash issue
Trailing slash is important.
$routes
->add_route(
'/articles'
);
# is different from
$routes
->add_route(
'/articles/'
);
If you don't want this behaviour pass strict_trailing_slash
to the constructor:
my
$routes
= Routes::Tiny->new(
strict_trailing_slash
=> 0);
Case sensitivity
Routes::Tiny is case sensitive by default (since 0.20).
It means that
$routes
->add_route(
'/admin/'
);
will NOT match both /admin/
and /ADMIN/
.
If you don't want this behaviour pass strict_case
to the constructor:
my
$routes
= Routes::Tiny->new(
strict_case
=> 0);
METHODS
new
my
$routes
= Routes::Tiny->new;
add_route
$routes
->add_route(
'/:service/:action'
);
Add a new route.
mount
$routes
->mount(
'/admin/'
,
$subroutes
)
Includes one Routes::Tiny instance into another with given prefix.
match
$routes
->match(
'/hello/world'
);
Match against a path.
build_path
$pattern
->build_path(
'name'
, {
foo
=>
'bar'
});
Build path from a given name and params.
DEVELOPMENT
Repository
CREDITS
Sergey Zasenko (und3f)
Roman Galeev (jamhed)
Dmitry Smal (mialinx)
Dinar (ziontab)
Jonathan R. Warden
Alexander Batyrshin
Konstantin Cherednichenko
AUTHOR
Viacheslav Tykhanovskyi, vti@cpan.org
.
COPYRIGHT AND LICENSE
Copyright (C) 2011-2017, Viacheslav Tykhanovskyi
This program is free software, you can redistribute it and/or modify it under the terms of the Artistic License version 2.0.