문제

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');
});
도움이 되었습니까?

해결책

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

다른 팁

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top