Search code examples
perldancer

perl dancer - how pass additional arguments to method hander subroutines?


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');
});

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";
    };