2013-07-11 2 views
5

gegeben das Beispiel plack App mit vielen Middleware-Komponenten und eine mojolicious App im Builder aktiviert (siehe unten), wie kann ich Parameter aus der app.psgi zu Mojolicious ohne Verwendung der hässlichen% ENV Hack gezeigt übergeben? Das Übergeben einer Config ist nur ein Beispiel, das kann ein Skalar/Objekt sein.Wie übergibt man Argumente von einer Plack-App an eine Mojolicious-App, die im Builder aktiviert ist?

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

Antwort

2

Dies ist eine interessante Frage und ist am einfachsten, indem man die Quelle in Angriff genommen. In Ihrem Beispiel verwenden Sie zu Recht

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

am source Blick zeigt, dass start_app eine ziemlich einfache Wrapper:

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

Es stellt sich heraus, dass build_app ist 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}; 
} 

eine Rückkehr neue Instanz der App-Klasse Die new Funktion der Mojolicious-Klasse ist more involved, aber am Ende it just calls the familiar startup method and returns the instance.

Dies bedeutet, dass Sie nicht einfach Argumente an die startup-Methode von Ihrem Middleware-Wrapper übergeben können, der standardmäßig verwendet wird. Ich kann mir zwei Mechanismen vorstellen, um das zu erreichen, was Sie tun wollen: 1) Schreiben Sie Ihre eigene build_app Funktion, die die Methode des Servers ersetzt, aber Argumente an $app->new übergibt (was wiederum an startup weitergegeben wird) oder 2) schreiben Sie Ihre eigene start_app Funktion die könnte eine andere startup ähnliche Funktion aufrufen.

# in MyApp.pm 

sub startup { 
    ... # as before 
} 

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

und

# app.psgi 

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

ich fragte auch die Quelle aber irgendwann aufgegeben. Ich dachte, es muss einen einfachen Weg geben, Parameter zu übergeben. aber da du einer der Hauptentwickler bist ... sollte vielleicht etwas wie 'Mojolicious :: Commands-> enable_app ('MyApp', @my_params)' zu Mojolicious hinzugefügt werden ;-)? – user2572744

+0

können Sie gerne auf den [IRC-Kanal] (http://mojolicio.us/perldoc/Mojolicious/Guides/Contributing#Feature_requests) springen: #mojo auf irc.perl.org –

Verwandte Themen