2013-07-11 30 views
5

給出示例plack應用程序使用大量中間件組件和在構建器中啓用的mojolicious app (請參閱下文),如何在不使用顯示的醜陋%ENV hack的情況下將參數從app.psgi傳遞到Mojolicious ?傳遞配置的原因只是一個例子,這可能是任何標量/對象。如何將參數從plack應用程序傳遞到在構建器中啓用的mojolicious應用程序?

app.psgi

use Plack::Builder; 

$ENV{CONFIG} = {...}; 

builder { 
    ... 
    Mojolicious::Commands->start_app('MyApp'); 
}; 

MyApp.pm

package MyApp; 

use Mojo::Base 'Mojolicious'; 

sub startup { 

    my $self = shift; 
    my $r = $self->routes; 

    $self->config($ENV{CONFIG}); 

    $r->route('/')->to('home#');   
} 

回答

2

這是一個有趣的問題,是最容易通過查看源解決。在您的例子中,你正確地使用

Mojolicious::Commands->start_app('MyApp'); 

望着source表明start_app是一個相當簡單的包裝:

sub start_app { 
    my $self = shift; 
    return Mojo::Server->new->build_app(shift)->start(@_); 
} 

事實證明,build_appas well

sub build_app { 
    my ($self, $app) = @_; 
    local $ENV{MOJO_EXE}; 
    return $app->new unless my $e = Mojo::Loader->new->load($app); 
    die ref $e ? $e : qq{Couldn't find application class "$app".\n}; 
} 

返回應用程序類的新實例。 Mojolicious類的new函數是more involved,但最終,it just calls the familiar startup method and returns the instance

這意味着您不能輕易地將參數傳遞給標準方式中使用的中間件包裝器中的startup方法。我可以想到兩種機制來完成你想要做的事情:1)編寫你自己的build_app函數來取代服務器的方法,但是它將參數傳遞給$app->new(它將依次傳遞給startup)或者2)編寫你自己的start_app函數這可能會調用另一個類似於startup的函數。

# in MyApp.pm 

sub startup { 
    ... # as before 
} 

sub after_startup { 
    ... # your new code here, 
     # or even most of what was in `startup` before 
} 

# app.psgi 

builder { 
    ... 
    my $app = Mojo::Server->new->build_app(shift); 
    $app->after_startup(@your_args_here); 
    $app->start(@_); 
} 
+0

我也問源,但在某些時候放棄了。我認爲必須有一個簡單的方法來傳遞參數。但是因爲你是核心開發人員之一......也許像'Mojolicious :: Commands-> enable_app('MyApp',@my_params)'應該被添加到Mojolicious ;-)? – user2572744

+0

歡迎您加入[IRC頻道](http://mojolicio.us/perldoc/Mojolicious/Guides/Contributing#Feature_requests):#mojo on irc.perl.org –

相關問題