2013-04-12 30 views
5

有沒有辦法將其他變量傳遞給方法處理程序子例程?我通常不喜歡在子例程範圍外使用全局變量。我喜歡數據庫連接和類實例,我希望處理程序有權訪問它們,而不使用全局變量。使用調試到控制檯,每個處理程序調用看起來像@_是空的。perl dancer - 如何將其他參數傳遞給方法hander子例程?

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

回答

3

一種方法是使用Dancer提供的vars散列。這裏我用一個鉤子之前建立一個數據庫句柄:

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

不確定這將適用於我的應用程序。它看起來像之前在主處理程序之前的每場比賽中運行。我想使用的一些變量是一次設置有點東西。它們包括類實例,我不想重新初始化每個到舞者的http方法調用。我希望有這樣的其他事情,但曾經只有一次。 –

+0

我也嘗試在鉤子外面使用「vars」。它不抱怨。但是,在方法處理程序內部時,該值不存在。 –

+0

'Only once called once'和'class instances'聽起來像你可能只想使用包變量。類似於我們的$ dbh = DBI-> connect();',在任何處理程序之外聲明。 – RickF

0

的東西,如

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

您可以訪問數據庫句柄從任何地方沒有它作爲全局數據庫連接不言直到你需要它,如果你稍後在程序中再次需要它,仍然在vars集合中,並且不需要再次創建。

相關問題