2013-07-11 33 views
5

biorąc pod uwagę przykład aplikacji plack z wykorzystaniem wielu komponentów oprogramowania pośredniego i mojolicious app włączone w konstruktorze (patrz poniżej), w jaki sposób mogę przekazać parametry z app.psgi do Mojolicious bez użycia pokazanego brzydkiego% ENV? przyczyny przekazywania konfiguracji to tylko przykład, może to być dowolny skalar/obiekt.jak przekazywać argumenty z aplikacji plack do mojolicious app enabled in builder?

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

Odpowiedz

2

To jest ciekawe pytanie i jest najłatwiej rozwiązać, patrząc na źródło. W przykładzie słusznie używać

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

Patrząc na source pokazuje, że start_app jest raczej prosty wrapper:

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

Okazuje się, że build_app jest as 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}; 
} 

Zwracanie nowa instancja klasy aplikacji. Funkcja Mojolicious klasy new to more involved, ale na koniec it just calls the familiar startup method and returns the instance.

Oznacza to, że nie można łatwo przekazać argumentów do metody startup z opakowania pośredniego, używanego w standardowy sposób. Mogę wymyślić dwa mechanizmy, aby osiągnąć to, co chcesz zrobić: 1) napisz własną funkcję build_app, aby zastąpić metodę serwera, ale która przekazuje argumenty do $app->new (która z kolei zostanie przekazana do startup) lub 2) napisz własną funkcję start_app które mogłyby wywoływać inną funkcję podobną do startup.

# in MyApp.pm 

sub startup { 
    ... # as before 
} 

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

i

# app.psgi 

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

Poprosiłam też źródło, ale w pewnym momencie zrezygnował. myślałem, że musi istnieć łatwy sposób przekazywania parametrów. ale jako że jesteś jednym z głównych programistów ... może coś takiego jak Mojolicious :: Commands-> enable_app ("MyApp ', @ my_params)" należy dodać do Mojolicious ;-)? – user2572744

+0

zapraszamy do przeskoku na [kanał IRC] (http://mojolicio.us/perldoc/Mojolicious/Guides/Contributing#Feature_requests): #mojo na irc.perl.org –