2013-04-12 11 views
5

Czy istnieje sposób przekazywania dodatkowych zmiennych do podprogramu procedury obsługi? Generalnie nie lubię używać zmiennych globalnych poza zakresem podprogramu. Mam takie rzeczy jak połączenie z bazą danych i instancje klasy, do których chciałbym, aby obsługa była dostępna bez użycia globali. Korzystanie z debugowania do konsoli wygląda tak, jakby @_ było puste dla każdego wywołania obsługi.perl dancer - jak przekazać dodatkowe argumenty do podprogramów 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'); 
}); 

Odpowiedz

3

Jednym ze sposobów jest użycie skrótu vars, który zapewnia Dancer. Tutaj używam przed hak założyć uchwyt bazy danych:

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

Nie jestem pewien, czy to zadziała w mojej aplikacji. Wygląda na to, że przed uruchomieniem każdego meczu przed główną procedurą obsługi. Niektóre zmienne, których chcę użyć, to jednorazowa konfiguracja. Obejmują one instancje klasy, których nie chcę reinicjalizować na każde wywołanie metody http dla tancerza. Szkoda, że ​​nie było czegoś takiego, ale tylko raz zostałem powołany. –

+0

Próbowałem również używać "vars" poza hakiem. To nie narzeka. Ale wartości nie ma, gdy znajduje się wewnątrz procedury obsługi metod. –

+0

"Tylko raz wywoływane" i "instancje klasy" brzmią tak, jakbyś chciał używać zmiennych pakietowych. Coś w rodzaju 'nasze $ dbh = DBI-> connect();', zadeklarowane poza wszelkimi procedurami obsługi. – RickF

0

z czymś

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

masz dostęp do uchwytu bazy danych z dowolnego miejsca i to bez globalny, połączenie z bazą danych nie jest dopóki go nie potrzebujesz i jeśli będziesz potrzebować go później w swoim programie, nadal znajduje się w kolekcji vars i nie musi być ponownie tworzony.

Powiązane problemy