如何将参数从plack应用程序传递到生成器中启用的mojolicus应用程序



给出了使用大量中间件组件和mojolicus应用程序的示例plack应用程序在builder中启用(见下文),我如何将参数从app.psgi传递给Mojolicus而不使用丑陋的%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#');        
}

这是一个有趣的问题,通过查看源代码最容易解决。在你的例子中,你正确地使用

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};
}

返回应用程序类的新实例。Mojolicus类的new函数涉及更多,但最终,它只调用熟悉的startup方法并返回实例。

这意味着您无法从中间件包装器(以标准方式使用)轻松地将参数传递给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(@_);
}

相关内容

  • 没有找到相关文章

最新更新