NAME

Lavoco::Web::App - Experimental framework with two constraints: FastCGI and Template::Toolkit.

VERSION

Version 0.06

SYNOPSIS

Framework to run small web apps, URL dispatching based on a flexible config file, rendering Template::Toolkit templates, running as a FastCGI application.

use Lavoco::Web::App;

my $app = Lavoco::Web::App->new;

my $action = lc( $ARGV[0] );   # (start|stop|restart)

$app->$action;

METHODS

Class Methods

new

Creates a new instance of the web-app object.

Attributes

base

The base directory of the application, detected using FindBin.

dev

A simple boolean flag to indicate whether you're running a development instance of the web-app.

It's on by default, and currently turned off if the base directory contains /live. Feel free to set it based on your own logic before calling start().

I typically use working directories such as /home/user/www.example.com/dev and /home/user/www.example.com/live.

This flag is useful to disable things like Google Analytics on the dev site.

The application object is available to all templates under the name app.

e.g. [% IF app.dev %] ... [% END %]

processes

Number of FastCGI process to spawn, 5 by default.

$app->processes( 10 );

templates

The directory containing the TT templates, by default it's $app->base . '/templates'.

filename

Filename for the config file, default is app.json and only JSON is currently supported.

config

The config as a hash-reference.

Instance Methods

start

Starts the FastCGI daemon. Performs basic checks of your environment and dies if there's a problem.

stop

Stops the FastCGI daemon.

restart

Restarts the FastCGI daemon, with a 1 second delay between stopping and starting.

CONFIGURATION

The app should be a simple Perl script in a folder with the following structure:

app.pl      # see the synopsis
app.json    # see below
app.pid     # generated, to control the process
app.sock    # generated, to accept incoming FastCGI connections
logs/
templates/
    404.tt

The config file is read for each and every request, this makes adding new pages easy, without the need to restart the application.

The config file should be placed in the base directory of your application.

See the examples directory for a sample JSON config file, something like the following...

{
   "pages" : [
      {
         "path" : "/",
         "template":"index.tt",
         ...
      },
      ...
   ]
   ...
   "send_alerts_from":"The Example App <no-reply@example.com>",
   "send_404_alerts_to":"you@example.com",
   ...
}

The entire config hash is available in all templates via [% app.config %], there are only a couple of mandatory/reserved attributes.

The mandatory field in the config is pages, an array of pages.

Each page should contain a path (for URL matching) and template to render.

All other fields are completely up to you, to fit your requirements.

When a request is made, a lookup is performed for a page by matching the path, which then results in rendering the associated template.

If no page is found, the template 404.tt will be rendered, make sure you have this file ready in the templates directory.

The page object is available in the rendered template, eg, [% page.path %]

It is often useful to have sub-pages and categories, etc. Simply create a pages attribute in a page object as another array of page objects.

If a sub-page is matched and selected for a request, an extra key for parents is included in the page object as a list of the parent pages, this is useful for building breadcrumb links.

TODO

Deep recursion for page/path lookups.

Deep recursion for sitemap.

Cleanup deeper recursion in pages with parents.

Searching, somehow, of some set of templates.

AUTHOR

Rob Brown, <rob at intelcompute.com>

LICENSE AND COPYRIGHT

Copyright 2014 Rob Brown.

This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.

See http://dev.perl.org/licenses/ for more information.