2013-04-25 4 views
2

Есть ли способ/функция для записи подпрограммы/метода автозапуска для всех доступных Mojolicious маршрутов?Mojolicious autostart/init() подпрограмма

Возможно, это автоматический помощник, но я еще не знаю, как это сделать.

Я думаю, что это особенно полезно для инициализации соединения с базой данных $ Self -> {ДБГ} почти каждый доступных маршрутов, ... так что я могу написать так:

helper DB => sub { state $dbh = Database->new }; 

get '/' => sub { 
    my $self = shift; 
    //$self->{dbh} // is automatically initialized & shared 
}; 

get '/another_route' => sub { 
    my $self = shift; 
    //$self->{dbh} // also initialized & shared 

}; 

вместо:

get '/' => sub { 
    my $self = shift; 
    $self->{dbh} = init_db(); 
}; 

get '/another_route' => sub { 
    my $self = shift; 
    $self->{dbh} = init_db(); 
}; 

PS: Я использую Mojolicious: Lite, Perl 5,16, SQLite3

ответ

3

Я не 100% уверен, что я понимаю ваш вопрос, helper делает почти то, что вы хотите, бу t вы не должны использовать хэш объекта. Вот как вы будете использовать ваш код:

helper db => sub { state $dbh = Database->new }; 

get '/' => sub { 
    my $self = shift; 
    $self->db->do_somthing(); 
}; 

get '/another_route' => sub { 
    my $self = shift; 
    my $dbh = $self->db; 
    ... 
}; 

helper методов доступны для использования всех контроллеров, шаблонами и основным приложением.

+0

Да, вы правы, но знаете ли вы, как напрямую обращаться к $ self -> {dbh} вместо $ self-> DB -> {dbh} в Mojolicious helper? или, возможно, интерфейса еще нет? – dns

+0

Прежде всего, доступ к данным экземпляра напрямую игнорируется в ООП. Perl (и большинство языков сценариев) не может принудительно вводить частные данные, но вы должны уважать его по дизайну. Во-вторых, invocant к обратным вызовам маршрута является новым экземпляром Mojolicious :: Controller, поэтому нет, вы не можете предварительно заполнить данные экземпляра, даже если хотите. Используя «состояние» в помощнике, вы делаете постоянный экземпляр соединения с базой данных (см. Также DBIx :: Connector), и вызов метода 'db' в моем примере будет извлекать этот экземпляр. –