Scroll to navigation

Lemonldap::NG::Common::PSGI::Router(3pm) User Contributed Perl Documentation Lemonldap::NG::Common::PSGI::Router(3pm)


Lemonldap::NG::Common::PSGI::Router - Base library for REST APIs of Lemonldap::NG.


  package My::PSGI;
  use base Lemonldap::NG::Common::PSGI::Router;
  sub init {
    my ($self,$args) = @_;
    # Will be called 1 time during startup
    # Declare REST routes (could be HTML templates or methods)
    $self->addRoute ( 'index.html', undef, ['GET'] )
         ->addRoute ( books => { ':book' => 'booksMethod' }, ['GET', 'POST'] )
         ->addRoute ( properties => { '*' => 'propertiesMethod' }, ['GET', 'POST', 'PUT', 'DELETE']);
    # Default route (ie: PATH_INFO == '/')
    # See Lemonldap::NG::Common::PSGI for other options
    # Return a boolean. If false, then error message has to be stored in
    # $self->error
    return 1;
  sub booksMethod {
    my ( $self, $req, @otherPathInfo ) = @_;
    my $book = $req->params('book');
    my $method = $req->method;
  sub propertiesMethod {
    my ( $self, $property, @otherPathInfo ) = @_;
    my $method = $req->method;

This package could then be called as a CGI, using FastCGI,...

  #!/usr/bin/env perl
  use My::PSGI;
  use Plack::Handler::FCGI; # or Plack::Handler::CGI
  Plack::Handler::FCGI->new->run( My::PSGI->run() );


This package provides base class for Lemonldap::NG REST API but could be used regardless.


See Lemonldap::NG::Common::PSGI for logging methods, content sending,...

Initialization methods

addRoute ( $word, $dest, $methods )

Declare a REST route. Arguments:

the first word of /path/info.
string, sub ref or hash ref (see "Route types" below)
array ref containing the methods concerned by this route.

Route types

As seen in "SYNOPSIS", you can declare routes with variable component. $dest can be:

the name of the method to call
$word is used as $dest
an anonymous subroutin to call
it's a recursive call to `{ $word => $dest }`
in this case each element of the array will be considered as `{ $element => $element }`. So each element must be a word that makes a correspondence between a path_info word and a subroutine

Some special $word:

the word in path_info will be stored in GET parameters
the subroutine will be called with the word of path_info as second argument (after $req)
if $word finishes with '.html', then sendHtml() will be called with 'something.tpl' as template name. In this case, $dest is not used.


http://.../books/127 with book() where 127 is the book number, use:
  $self->addRoute( books => { ':bookId' => 'book' }, ['GET'] );

bookId parameter will be stored in $req->params('bookId');

http://.../books/127/pages/5 with page(), use:
  $self->addRoute( books => { ':bookId' => { pages => { ':pageId' => 'page' } } }, ['GET'] );
  $self->addRoute( books => { ':bookId' => { pages => { ':pageId' => 'page' } } }, ['GET'] )
       ->addRoute( books => { ':bookId' => { '*' => 'book' } }, ['GET'] );

Note that book() will be called for any path_info containing /books/<$bookid>/<$other> except if $other == 'pages'.

  $self->addRoute( properties => [ 'p1', 'p2' ] );


This method defined which path_info to use if path_info is '/' or empty.


See Lemonldap::NG::Common::PSGI for inherited accessors (error, languages, logLevel, staticPrefix, templateDir, links, syslog).


<>, Lemonldap::NG::Portal, Lemonldap::NG::Handler, Plack, PSGI, Lemonldap::NG::Common::PSGI, Lemonldap::NG::Common::PSGI::Request, HTML::Template,



Use OW2 system to report bug or ask for features: <>


Lemonldap::NG is available at <>


See COPYING file for details.

This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see <>.

2022-02-25 perl v5.32.1