NAME
Mojo::Manual::Mojolicious - Mojolicious
ROUTES
Routes allow you to map requests to controllers and actions.
Simple route
Let's look at this example.
# /articles
$r->route('/articles')->to(controller => 'article', action => 'list');
When a user requests /articles
, the module Article.pm
is loaded and the method list
will be called. controller
and action
values are important, because they decide what is going to be called if a path matches the given pattern.
Additional parameters
Besides controller
and action
you can define as many parameters as you like.
# /articles (sort_by = 'date')
$r->route('/articles')
->to(controller => 'article, action => 'list', sort_by => 'date');
Placeholders
Pattern can be more specific and automatically provide parameters through placeholders.
# /*
$r->route('/:controller')->to(action => 'list');
The colon means that controller
will be automatically captured and passed along.
Default values
You can specify default values for all parameters.
# /* (id = 1)
# /*/*
$r->route('/:controller/:id')->to(action => 'view', id => 1);
The value for id
will be 1
if it's not specified.
Constraints
Parameters can also have constraints.
# /articles/5
$r->route('/articles/:id', id => qr/\d+/)
->to(controller => 'article', action => 'view');
This will only match if id
is a number. There is no need to specify ^
and $
, because they are automatically added.
Optional parameters
Values are required if no default value was given. You can also just set default values to undef
to make them entirely optional.
# /archive
# /archive/2008
$r->route('/archive/:year')
->to(controller => 'archive', action => 'list', year => undef);
Nested routes
Don't repeat yourself. For a given root pattern you can have multiple nested pattern. This can be used to factor out repetitive code.
# /books/5/edit
# /books/5/delete
my $b = $r->route('/books/:id')->to(controller => 'book');
$b->route('/edit')->to(action => 'edit');
$b->route('/delete')->to(action => 'delete');
Bridges
Sometimes it is neccessary to call multiple method after another (e.g. authorization, data processing). That's what bridge
is for.
# /blog
$r->bridge->to(controller => 'foo', action =>'auth')
->route('/blog')->to(action => 'list');
Foo::auth
will be called before Foo::list
.
Waypoints
Waypoint is something in between bridges and nested routes. It can match even if it's not an endpoint, but will behave just like route
if children are matching too.
# /books
my $b = $r->waypoint('/books')->to(controller => 'books', action => 'list');
# /books/1
$b->route('/:id', id => qr/\d+/)->to(action => 'view');
Quoted symbols
It is not only possible to catch parameters from slash to slash, you can also quote them with parentheses for more advanced matching.
# /view-5
# /delete-1
$r->route('/:(action)-:(id)')->to(controller => 'album');