5

多くのミドルウェア コンポーネントを使用するサンプル plack アプリと、ビルダーで有効になっている mojolicious アプリ (以下を参照) を考えると、表示されている醜い %ENV ハックを使用せずに、app.psgi から Mojolicious にパラメーターを渡すにはどうすればよいでしょうか? 構成を渡す原因は単なる例であり、これは任意のスカラー/オブジェクトである可能性があります。

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

1 に答える 1

2

これは興味深い質問であり、ソースを見ることで最も簡単に解決できます。あなたの例では、あなたは正しく使用します

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

ソースを見るstart_appと、かなり単純なラッパーであることがわかります。

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

それも同様build_appであることがわかります:

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関数はより複雑ですが、最終的にはおなじみのstartupメソッドを呼び出してインスタンスを返すだけです。

startupこれは、標準的な方法で使用されるミドルウェア ラッパーからメソッドに引数を簡単に渡すことができないことを意味します。あなたがやりたいことを達成するための2つのメカニズムを考えることができます: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(@_);
}
于 2013-07-14T18:52:05.053 に答える