2013-04-12 28 views
5

Có cách nào để chuyển các biến bổ sung vào một trình xử lý phương thức con không? Tôi thường không thích sử dụng các biến toàn cầu bên ngoài phạm vi của chương trình con. Tôi có những thứ như kết nối cơ sở dữ liệu và trường hợp lớp mà tôi muốn các trình xử lý có quyền truy cập vào, mà không sử dụng globals. Sử dụng gỡ lỗi để bàn điều khiển, có vẻ như @_ trống cho mỗi cuộc gọi xử lý.perl dancer - cách chuyển đối số bổ sung cho các trình con thủ tục phương thức?

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

Trả lời

3

Một cách là sử dụng hàm băm vars mà Dancer cung cấp. Ở đây tôi sử dụng một trước khi móc để thiết lập một xử lý cơ sở dữ liệu:

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

Không chắc chắn rằng nó sẽ làm việc cho ứng dụng của tôi. Nó trông giống như trước khi chạy trên mọi trận đấu trước khi trình xử lý chính thường trình. Một số biến tôi muốn sử dụng là một công cụ thiết lập thời gian. Chúng bao gồm các cá thể lớp, mà tôi không muốn khởi động lại trên mọi lời gọi phương thức http đến vũ công. Tôi ước gì có thứ gì đó như thế này, nhưng chỉ được gọi một lần thôi. –

+0

Tôi cũng đã thử sử dụng "vars" bên ngoài móc. Nó không phàn nàn. Nhưng giá trị không có khi bên trong trình xử lý phương thức. –

+0

'Chỉ được gọi là một lần' và 'âm thanh lớp' như bạn có thể chỉ muốn sử dụng các biến gói. Một cái gì đó giống như '$ dbh = DBI-> connect();' của chúng tôi, được khai báo bên ngoài bất kỳ trình xử lý nào. – RickF

0

Với một cái gì đó giống như

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

bạn có quyền truy cập vào các xử lý cơ sở dữ liệu từ bất cứ nơi nào mà không có nó là toàn cầu, kết nối cơ sở dữ liệu không được thực hiện cho đến khi bạn cần nó và, nếu bạn cần nó một lần nữa sau trong chương trình của bạn, vẫn còn trong bộ sưu tập vars và không cần phải được tạo ra một lần nữa.

Các vấn đề liên quan