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

StackOverflow https://stackoverflow.com/questions/15973928

  •  03-04-2022
  •  | 
  •  

Вопрос

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