NAME
Mojolicious::Plugin::RESTRoutes - routing helper for RESTful operations
VERSION
version 1.0.0
DESCRIPTION
This Mojolicious plugin adds a routing helper for REST
<http://en.wikipedia.org/wiki/Representational_state_transfer>ful CRUD
<http://en.wikipedia.org/wiki/Create,_read,_update_and_delete>
operations via HTTP to the app.
The routes are intended, but not restricted to be used by AJAX
applications.
MOJOLICIOUS SHORTCUTS
rest_routes
Can be used to easily generate the needed RESTful routes for a
resource.
my $r = $self->routes;
my $userroute = $r->rest_routes(name => 'user');
# Installs the following routes (given that $r->namespaces == ['My::Mojo']):
# GET /users --> My::Mojo::User::rest_list()
# POST /users --> My::Mojo::User::rest_create()
# GET /users/:userid --> My::Mojo::User::rest_show()
# PUT /users/:userid --> My::Mojo::User::rest_update()
# DELETE /users/:userid --> My::Mojo::User::rest_remove()
Please note: the english plural form of the given name attribute will
be used in the route, i.e. "users" instead of "user". If you want to
specify another string, see parameter route below.
You can also chain rest_routes:
$userroute->rest_routes(name => 'hat', readonly => 1);
# Installs the following additional routes:
# GET /users/:userid/hats --> My::Mojo::Hat::rest_list()
# GET /users/:userid/hats/:hatid --> My::Mojo::Hat::rest_show()
The target controller has to implement the following methods:
* rest_list
* rest_create
* rest_show
* rest_update
* rest_remove
Parameters to control the route creation
name
The name of the resource, e.g. a "user", a "book" etc. This name will
be used to build the route URL as well as the controller name (see
example above).
readonly (optional)
If set to 1, no create/update/delete routes will be created
controller (optional)
Default behaviour is to use the resource name to build the CamelCase
controller name (this is done by Mojolicious::Routes::Route). You can
change this by directly specifying the controller's name via the
controller attribute.
Note that you have to give the real controller class name (i.e.
CamelCased or whatever you class name looks like) including the full
namespace.
$r->rest_routes(name => 'user', controller => 'My::Mojo::Person');
# Installs the following routes:
# GET /users --> My::Mojo::Person::rest_list()
# ...
route (optional)
Specify a name for the route, i.e. prevent automatic usage of english
plural form of the name parameter as the route component.
$r->rest_routes(name => 'angst', route => 'aengste');
# Installs the following routes (given that $r->namespaces == ['My::Mojo']):
# GET /aengste --> My::Mojo::Angst::rest_list()
How to retrieve the parameters / IDs
There are two ways to retrieve the IDs given by the client in your
rest_show, rest_update and rest_remove methods.
Example request: GET /users/5/hats/no9
1. New way: the stash entry fm.ids holds a hash with all ids:
package My::Mojo::Hats;
use Mojo::Base 'Mojolicious::Controller';
sub rest_show {
use Data::Dump qw(dump);
print dump($self->stash('fm.ids'));
# { user => 5, hat => 'no9' }
}
2. Old way: for each resource there will be a parameter ***id, e.g.:
package My::Mojo::Hat;
use Mojo::Base 'Mojolicious::Controller';
sub rest_show {
my ($self) = @_;
my $user = $self->param('userid');
my $hat = $self->param('hatid');
return $self->render(text => "$userid, $hatid");
# text: "5, no9"
}
Furthermore, the parameter idname holds the name of the last ID in the
route:
package My::Mojo::Hat;
use Mojo::Base 'Mojolicious::Controller';
sub rest_show {
my $p_name = $self->param('idname');
my $id = $self->param($p_name);
return $self->render(text => sprintf("%s = %s", $p_name, $id || ''));
# text: "hatid = 5"
}
METHODS
register
Adds the routing helper (called by Mojolicious).
AUTHOR
Jens Berthold <cpan@jebecs.de>
COPYRIGHT AND LICENSE
This software is Copyright (c) 2017 by Jens Berthold.
This is free software, licensed under:
The MIT (X11) License