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');