2013-07-11 15 views
5

dato l'app plack di esempio che utilizza molti componenti middleware e un'app mojolicious abilitata nel builder (vedi sotto), come posso passare i parametri da app.psgi a Mojolicious senza utilizzare il brutto% ENV hack mostrato? di causa il passaggio di una configurazione è solo un esempio, questo potrebbe essere qualsiasi oggetto scalare /.come passare gli argomenti da un app plack ad un app mojolicious abilitato a costruttore?

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

risposta

2

Questa è una domanda interessante ed è più facilmente affrontato, cercando in fonte. Nel tuo esempio si utilizza giustamente

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

Guardando il source mostra che start_app è un piuttosto semplice involucro:

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

Si scopre che build_app è 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}; 
} 

restituzione di un nuova istanza della classe della tua app. La funzione del classe Mojolicious new è more involved, ma alla fine, it just calls the familiar startup method and returns the instance.

Ciò significa che non è possibile passare facilmente argomenti al metodo startup dal proprio wrapper middleware, utilizzato nel modo standard. Mi vengono in mente due meccanismi per realizzare ciò che si vuole fare: 1) scrivere la propria funzione build_app per sostituire il metodo del server, ma che passa gli argomenti al $app->new (che andrebbe passato alla startup a sua volta) o 2) scrivere la propria funzione start_app che potrebbe chiamare un'altra funzione startup -like.

# in MyApp.pm 

sub startup { 
    ... # as before 
} 

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

e

# app.psgi 

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

Ho anche chiesto la fonte, ma ad un certo punto ha rinunciato. Pensavo ci dovesse essere un modo semplice per passare i parametri. ma come tu sei uno degli sviluppatori principali ... forse qualcosa come 'Mojolicious :: Comandi-> enable_app ('MyApp', @my_params)' dovrebbe essere aggiunto al Mojolicious ;-)? – user2572744

+0

siete invitati a salire sul [canale IRC] (http://mojolicio.us/perldoc/Mojolicious/Guides/Contributing#Feature_requests): #mojo su irc.perl.org –

Problemi correlati