Подпрограмма Mojolicious autostart/init()

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

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

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

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();
};

P.S. Я использую Mojolicious: Lite, Perl 5.16, SQLite3.


person dns    schedule 25.04.2013    source источник


Ответы (1)


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

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 методов доступны для использования всеми контроллерами, шаблонами и основным приложением.

person Joel Berger    schedule 25.04.2013
comment
да, вы правы, но знаете ли вы, как получить прямой доступ к $self-›{dbh} вместо $self-›DB-›{dbh} в помощнике Mojolicious? или, может быть, интерфейса еще не существует? - person dns; 25.04.2013
comment
Прежде всего, прямой доступ к данным экземпляра не приветствуется в ООП. Perl (и большинство скриптовых языков) не может применять приватные данные, но вы должны уважать это по замыслу. Во-вторых, вызовом для обратных вызовов маршрута является новый экземпляр Mojolicious::Controller, поэтому нет, вы не можете предварительно заполнить данные этого экземпляра, даже если захотите. Используя state в помощнике, вы создаете постоянный экземпляр соединения с базой данных (см. также DBIx::Connector), и вызов метода db в моем примере извлечет этот экземпляр. - person Joel Berger; 25.04.2013