给出了使用大量中间件组件和一个mojolicIoUs应用程序的示例plack app
在构建器中启用(见下文),如何将参数从app.psgi传递给MojolicIoUs
没有使用丑陋的%ENV hack显示?传递配置的原因只是一个例子,这可能是任何标量/对象.
在构建器中启用(见下文),如何将参数从app.psgi传递给MojolicIoUs
没有使用丑陋的%ENV hack显示?传递配置的原因只是一个例子,这可能是任何标量/对象.
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');
查看source显示start_app是一个相当简单的包装器:
sub start_app { my $self = shift; return Mojo::Server->new->build_app(shift)->start(@_); }
事实证明build_app是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}; }
返回应用类的新实例. MojolicIoUs类的新功能是more involved,但最终,it just calls the familiar startup
method and returns the instance.
这意味着您无法轻松地从标准方式使用的中间件包装器将参数传递给启动方法.我可以想到两种机制来完成你想要做的事情:1)编写你自己的build_app函数来替换服务器的方法但是将参数传递给$app-> new(它将依次传递给启动)或2)编写自己的start_app函数,可以调用另一个类似启动的函数.
# 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(@_); }