で、よくよく調べてみると、どうやらPlack::SandboxとAttribute::Handlersの相性がよろしくない模様でした。
検証用コード - eg/sample.pl
まあ幾つかツッコミどころが有りますけど、問題の本質とは関連がないものばかりの筈なのでスルー。use warnings;
use strict;
use lib qw( ../lib ./lib );
use Attribute::Handlers;
use Router::Simple;
use Data::Dumper;
my $router;
BEGIN {
$router = Router::Simple->new();
}
sub Path :ATTR {
warn Dumper( @_ );
my $path = $_[4];
my $code = $_[2];
$router->connect( $path, { code => $code } );
}
sub myapp : Path(/) {
warn Dumper( @_ );
[ 200, ['text/html'], ['Hello, world!'] ];
}
warn Dumper( $router, __PACKAGE__ );
sub {
my $env = shift;
if ( my $p = $router->match( $env ) ) {
$p->{ code }->( $p );
}
else {
[404, [], ['no']];
}
};
perlコマンドから直接実行して見た場合
$ perl eg/sample.pl
Useless use of reference constructor in void context at eg/sample.pl line 35.
$VAR1 = 'main';
$VAR2 = \*::myapp;
$VAR3 = sub { "DUMMY" };
$VAR4 = 'Path';
$VAR5 = '/';
$VAR6 = 'CHECK';
$VAR7 = 'eg/sample.pl';
$VAR8 = 24;
$VAR1 = bless( {
'routes' => [
bless( {
'pattern_re' => qr/(?-xism:^\\/$)/,
'pattern' => '/',
'capture' => [],
'dest' => {
'code' => sub { "DUMMY" }
},
'name' => undef,
'on_match' => undef
}, 'Router::Simple::Route' )
]
}, 'Router::Simple' );
$VAR2 = 'main';
一応、Pathアトリビュートのトリガが引かれていることが確認できてます。plackupした場合
では、今度はeg/sample.plをplackupで起こしてみます。$ plackup eg/sample.pl
$VAR1 = bless( {
'routes' => []
}, 'Router::Simple' );
$VAR2 = 'Plack::Sandbox::eg_2fsample_2epl';
HTTP::Server::PSGI: Accepting connections at http://0:5000/
こんな感じで、Pathアトリビュートのトリガが引かれません。誰かおしえてください
どなたかご存知の方、教えてください。よろしくお願いしますm(_ _)m
教えていただきました!
Twitterで、色々な方にご教示頂きました!この場を借りて、改めて御礼申し上げます。まとめると、僕は「Attribute病」:) に罹患していたらしく、
・PSGIアプリではINIT/CHECKなどが呼ばれないため、アトリビュートはほぼ動かない。
・アトリビュート使うと、第3者からみて「何してるかわからないコード」になってしまい、おすすめできない。
・Attr::Handlers sucks, and Perl5 attribute sucks too. で FA。
ということらしいです。従って結論は
アトリビュートを使うのはお止しなさい
0 件のコメント:
コメントを投稿