【问题标题】:perl dancer - how pass additional arguments to method hander subroutines?perl dancer - 如何将附加参数传递给方法处理程序子例程?
【发布时间】:2013-04-12 14:25:49
【问题描述】:

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

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

【问题讨论】:

    标签: perl dancer


    【解决方案1】:

    一种方法是使用 Dancer 提供的 vars 哈希。这里我使用了一个 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";
    };
    

    【讨论】:

    • 不确定这是否适用于我的应用程序。看起来 before 在主处理程序例程之前的每场比赛中运行。我想使用的一些变量是一次性设置的东西。它们包括类实例,我不想在每个对 dancer 的 http 方法调用上重新初始化它。我希望有其他类似的东西,但只被调用过一次。
    • 我也尝试在钩子外使用“vars”。它不抱怨。但是在方法处理程序内部时该值不存在。
    • “只调用一次”和“类实例”听起来您可能只想使用包变量。像our $dbh = DBI->connect(); 这样的东西,在任何处理程序之外声明。
    【解决方案2】:

    类似的东西

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-01
      • 2021-03-09
      • 2016-11-22
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      相关资源
      最近更新 更多