Apache、mod_perlにおけるpnotesのようにリクエスト単位でデータを保持できるPlack::Middlewareをリリースしました。実装にはScope::Containerを利用しています。
使い方は簡単Plack::BuilderでScope::Containerのmiddlewareを有効にします
use Plack::Builder;
builder {
enable "Scope::Container";
$app;
};
とくにオプションなどはありません。
これでリクエストがあった際にScope::Containerのstartscopecontaierを呼んでくれるので、アプリケーションのなかでscope_containerを使って簡単にデータの出し入れが行えます。
以下はHTTP接続をリクエストの間だけKeepAliveするサンプル
package MyApp::UA;
use Scope::Container;
use LWP::UserAgent;
sub getua {
if ( in_scope_container() && my $ua = scope_container('ua') ) {
return $ua;
} else {
my $ua = LWP::UserAgent->new(keep_alive=>1);
scope_container('ua', $ua) if in_scope_container();
return $ua;
}
}
package MyApp;
sub app {
my $env = shift;
$ua = MyApp::UA->getua(); # new instance
$ua = MyApp::UA->getua(); # from container cache
$ua = MyApp::UA->getua(); # from container cache
return [ '200', [] ["OK"]];
# disconnect keepalive and destroy $ua
}
もちろんWebアプリケーションだけに限れば、$envでも実現できることは多いですが、Scope::Containerを使うことでモデル層のモジュールをWebのリクエスト/レスポンスの世界とを疎となるように構築し、必要な場所に限ってMiddlewareでそれを結びつけることができます。