Skip to content

ironcamel/Dancer-Plugin-Dispatcher

Repository files navigation

NAME

Dancer::Plugin::Dispatcher - Controller Class Dispatching System for Dancer

VERSION

version 0.13

STATUS

SYNOPSIS

use Dancer;
use Dancer::Plugin::Dispatcher;

get '/login'     => dispatch '#login';
get '/dashboard' => dispatch '#check_session', '#dashboard';

sub login {
    halt 'Unauthorized' unless login_okay scalar params;
    redirect '/dashboard';
}

sub check_session {
    var sessions => generate_session;
}

sub dashboard {
    template 'dashboard';
}

dance;

DESCRIPTION

Dancer::Plugin::Dispatcher provides a mechanism for dispatching HTTP requests to controller classes allowing you to better separate and compartmentalize your Dancer application. This simple approach is a building block towards giving your Dancer application a more scalable MVC architecture. Note: This is an early release available for testing and feedback and as such is subject to change. The latest release of this distribution breaks backwards compatibility with version 0.12 or anything prior. This plugin leverages dependency injection to load the objects that the HTTP requests will be dispatched to. The invesion of control container is provided by Beam::Wire which supports various patterns for dynamically loading controllers.

METHODS

dispatch

This method takes a string, referred to as a dispatch string, and returns a coderef. The dispatch string represents a controller service and action. The controller service is a Beam::Wire service container configuration. All controller services should be specified under the services property in the plugin configuration. The controller service action is a method on the object which the service loads. The following are the dispatch string semantics:

plugins:
    Dispatcher:
        services:
            artists:
                class: MyApp::Artist

The '#' character is used to separate the controller service name and
action (method): e.g. (service#action).

dispatch '#index'; -> dispatches main->index or caller->index
where caller is the namespace of whichever package loads the plugin

dispatch 'artists#find'; # dispatches MyApp::Artist->new->find
dispatch 'artists#single'; # dispatches MyApp::Artist->new->single

Another benefit in using this plugin is a better method of chaining actions. The current method of chaining suggests that you create a catch-all* route which you then use to perform some actions then pass the request to the next matching route forcing you to use mega-splat and re-parse routes to find the next match.

Chaining actions with this plugin only requires you to supply multiple dispatch strings to the dispatch keyword:

get '/secured' => dispatch '#check_session', '#secured';

sub chksession {
    return redirect '/' unless session 'user';
}

sub secured {
    template 'secured';
}

If it isn't obvious, when chaining, the dispatch keyword takes multiple dispatch strings and returns a coderef that will execute them sequentially. The first action to explicitly halt execution, by calling Dancer's halt keyword, or issue a 3xx series redirect will break the dispatch chain.

CONFIGURATION

Configuration details will be optionally grabbed from your Dancer config file although no configuration is neccessary. For example:

plugins:
  Dispatcher:
    services:
        artists:
            class: MyApp::Artist
        albums:
            class: MyApp::Album
        songs:
            class: MyApp::Song

If no configuration information is given, this plugin will attempt to use the calling (or main) namespace as the controller where requests will be dispatched. Controller methods can have a prefix and/or a suffix automatically applied before dispatch. For example:

plugins:
    Dispatcher:
        prefix: do_
        suffix: _action
        services:
            artists:
                class: MyApp::Artist
            albums:
                class: MyApp::Album
            songs:
                class: MyApp::Song

The prefix and suffix values are optional and will be applied be resolving the controller dispatch chain.

get '/' => dispatch '#index'; # will execute do_index_action

AUTHORS

CONTRIBUTORS

COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Al Newkirk.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

About

Simple yet Powerful Controller Class dispatcher for Dancer

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages