我的路由配置为:
$rn = $rn->any( '/users', sub{ my $c = shift; $DB::single = 1; 1; } ); # first cb
$rn = $rn->any( '/me', sub{ my $c = shift; $DB::single = 1; 1; } ); # second cb
$rn = $rn->any( '/avatar' )->to( 'avatar#test' ); # action
当我请求GET /users/me/avatar
时,我会执行第二次回调。
但我希望avatar#test
行动能够继续。
我很困惑。 DOC州:
嵌套路由不会继承的cb存储值可以用来绕过控制器并执行回调。
/avatar
嵌套在/me
中,cb
不应继承,但在发送时,我会stack
获得cb
值。这是转储:
[
{ action => "test", cb => sub { ... }, controller => "avatar" },
]
请有人澄清一下。在DOC状态下,堆栈中存在第二个cb
的原因不应该是什么?
答案 0 :(得分:1)
虽然这没有描述为什么cb
被调用时不应该被调用。我们可以控制一下:
$rn = $rn->any( '/users' );
$rn = $rn->any( '/:id', \&setup_id )->inline( 1 ); # Enable: /users/me/avatar
$rn = $rn->any( '/avatar' )->to( 'avatar#test' );
始终会调用inline
选项强制setup_id
子。在此子目录中,我们由当前用户设置参数id
。因此,我们可以写/users/23/avatar
代替/users/me/avatar
:
sub setup_id {
my $c = shift;
my $id = $c->param( 'id' );
# TODO: Should we replace $c->stash->{ id } too?
$c->param( id => $c->uid ) if $id && $id eq 'me';
return 1;
}
提示:不要忘记return 1