5

有没有办法将附加变量传递给方法处理程序子例程?我通常不喜欢在子例程范围之外使用全局变量。我有诸如数据库连接和类实例之类的东西,我希望处理程序可以访问它们,而无需使用全局变量。使用调试到控制台,看起来 @_ 对于每个处理程序调用都是空的。

#!/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');
});
4

2 回答 2

3

一种方法是使用varsDancer 提供的散列。这里我使用了一个 before 钩子来设置一个数据库句柄:

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";
};
于 2013-04-12T15:11:50.817 回答
0

有类似的东西

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

您可以从任何地方访问数据库句柄而不是全局的,数据库连接在您需要它之前不会建立,如果您稍后在程序中再次需要它,它仍然在 vars 集合中并且不需要再次创建.

于 2013-08-03T16:45:37.083 回答