为什么没有调用猥亵行为?

时间:2017-03-16 10:22:03

标签: perl mojolicious

我的路由配置为:

$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的原因不应该是什么?

1 个答案:

答案 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