2013-07-11 33 views
5

cho ví dụ ứng dụng plack sử dụng nhiều thành phần trung gian và một ứng dụng mojolicious được bật trong trình tạo (xem bên dưới), làm cách nào tôi có thể chuyển tham số từ app.psgi sang Mojolicious mà không sử dụng% ENV xấu xí được hiển thị? của nguyên nhân đi qua một cấu hình chỉ là một ví dụ, điều này có thể là bất kỳ vô hướng/đối tượng.cách chuyển đối số từ ứng dụng plack sang ứng dụng tiện lợi được bật trong trình tạo?

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

Trả lời

2

Đây là một câu hỏi thú vị và dễ dàng nhất giải quyết bằng cách nhìn vào nguồn. Trong ví dụ của bạn, bạn một cách đúng đắn sử dụng

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

Nhìn vào source cho thấy start_app là một wrapper khá đơn giản:

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

Nó chỉ ra rằng 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}; 
} 

trả lại một phiên bản mới của lớp ứng dụng của bạn. Chức năng new của Mojolicious là more involved, nhưng cuối cùng, it just calls the familiar startup method and returns the instance.

Điều này có nghĩa là bạn không thể dễ dàng chuyển đối số cho phương thức startup từ trình bao bọc phần mềm trung gian, được sử dụng theo cách tiêu chuẩn. Tôi có thể nghĩ về hai cơ chế để thực hiện những gì bạn muốn làm: 1) viết hàm build_app của riêng bạn để thay thế phương thức của máy chủ nhưng chuyển đối số sang $app->new (lần lượt được chuyển sang số startup) hoặc 2) viết hàm start_app của riêng bạn có thể gọi hàm khác giống như 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

tôi cũng hỏi những nguồn nhưng tại một số điểm bỏ cuộc. tôi nghĩ rằng có phải là một cách dễ dàng để vượt qua các thông số. nhưng như bạn là một trong những nhà phát triển cốt lõi ... có thể một cái gì đó như 'Mojolicious :: Lệnh-> enable_app ('MyApp', @my_params)' nên được thêm vào Mojolicious ;-)? – user2572744

+0

bạn được hoan nghênh tham gia [kênh IRC] (http://mojolicio.us/perldoc/Mojolicious/Guides/Contributing#Feature_requests): #mojo trên irc.perl.org –