ググってもそれらしき情報が全然出てこなかったので自分用メモ
メソッドをregisterするときのoptionに
{
with_self => 1,
}
を指定すれば、メソッド呼び出し時の第1引数にアプリ本体が渡ってくるので、そこから$app->req->envとかなんでも自由に取り出して使える。
困りごと
ただし、PODの最初にあるような基本的な使い方をすると、JSONRPCの処理を行うメソッドがregister
と同じ階層に散らかってしまいコードの見通しが良くない。
use MojoX::JSON::RPC::Service;
my $svc = MojoX::JSON::RPC::Service->new;
$svc->register(
'sum',
sub {
my ($app, @params) = @_;
my $sum = 0;
$sum += $_ for @params;
return $sum;
},
{
with_self => 1,
}
);
そして、PODの二つ目にあるように MojoX::JSON::RPC::Serviceを継承したモジュールを作って、register_rpc_method_namesでメソッドの登録を行うと、register時の引数として自動的に with_svc_obj => 1
が指定され、メソッド内の第1引数が Service オブジェクトになってしまうため、自由にいろいろアクセスできない。
package MyService;
use Mojo::Base 'MojoX::JSON::RPC::Service';
sub sum {
my ($self, @params) = @_;
my $sum = 0;
$sum += $_ for @params;
return $sum;
}
__PACKAGE__->register_rpc_method_names( 'sum' );
解決策
register_rpc_method_namesはやめて、new の時に自分でregisterしてやることにした。
package MyService;
use Mojo::Base 'MojoX::JSON::RPC::Service';
my @METHODS = qw/ sum /;
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
for(@methods){
$self->register(
$_ => \&{$_},
{
with_self => 1.
}
);
}
return $self;
}
sub sum {
my ($app, @params) = @_;
my $sum = 0;
$sum += $_ for @params;
return $sum;
}
## Then in Mojolicious application
$self->plugin(
'json_rpc_dispatcher',
services => {
'/jsonrpc' => MyService->new,
}
);
参考リンク
MojoX::JSON::RPC::Service
http://search.cpan.org/~henryykt/MojoX-JSON-RPC-0.04/lib/MojoX/JSON/RPC/Service.pm