2013-07-11 13 views
5

बिल्डर में सक्षम मिडलवेयर घटकों और एक mojolicious ऐप का उपयोग कर उदाहरण प्लैक ऐप दिया गया है (नीचे देखें), मैं app.psgi से Mojolicious से पैरामीटर कैसे उत्तीर्ण कर सकते हैं बिना बदसूरत% ENV हैक का उपयोग किए? एक कॉन्फ़िगरेशन पास करने का कारण सिर्फ एक उदाहरण है, यह कोई स्केलर/ऑब्जेक्ट हो सकता है।किसी प्लेक ऐप से तर्क को बिल्डर में सक्षम एक मोज़ोलियस ऐप में कैसे पास किया जाए?

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

आपको [आईआरसी चैनल] (http://mojolicio.us/perldoc/Mojolicious/Guides/Contributing#Feature_requests) पर हॉप करने के लिए आपका स्वागत है: irmoperl.org पर #mojo –

संबंधित मुद्दे