Question

Is there a way to pass additional variables to a method handler subroutine? I generally dislike using global variables outside the subroutine's scope. I have things like database connection and class instances which I would like the handlers to have access to, without using globals. Using debug to console, looks like @_ is empty for each handler call.

#!/usr/bin/perl

use strict;

use Dancer;
use Data::Dumper;

set('logger' => 'console');

my $somevar = SomeClass->new();

get('/' => sub{
  debug(Dumper(@_));
  debug($somevar);
  return('hello world');
});
Was it helpful?

Solution

One way is to use the vars hash that Dancer provides. Here I use a before hook to set up a database handle:

use strict;
use warnings;
use Dancer;
use DBI;

hook 'before' => sub {
    var dbh => DBI->connect_cached(...);
};

get '/' => sub { 
    my $qry = vars->{dbh}->prepare("SQL");
    ...
    return "Something, something, query results";
};

OTHER TIPS

With something like

sub get_dbh {
    if (! vars('dbh')) {
        my $dbh = DBI->connect_cached(...);
        session(dbh => $dbh);
    }
    return vars('dbh');
}

you have access to the database handle from anywhere without it being global, the database connection is not made until you need it and, if you need it again later in your program, is still in the vars collection and does not need to be created again.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top