The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

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