【问题标题】:Mojolicious autostart/init() subroutineMojolicious 自动启动/init() 子程序
【发布时间】:2013-04-25 15:03:02
【问题描述】:

是否有一种方法/功能可以为所有可用的 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

【问题讨论】:

    标签: perl mojolicious


    【解决方案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 方法可供所有控制器、模板和主应用程序使用。

    【讨论】:

    • 是的,你是对的,但你知道如何在 Mojolicious 助手上直接访问 $self->{dbh} 而不是 $self->DB->{dbh} 吗?或者可能还没有接口存在?
    • 首先,直接访问实例数据在OOP中是不被接受的。 Perl(和大多数脚本语言)不能强制执行私有数据,但您应该在设计上尊重它。其次,路由回调的调用者是 Mojolicious::Controller 的新实例,所以不,即使您愿意,也无法预填充该实例数据。通过在帮助程序中使用 state,您可以创建数据库连接的持久实例(另请参见 DBIx::Connector)并在我的示例中调用方法 db 将获取该实例。
    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多