如何在一条莫名的路线上添加多个over方法?

时间:2012-08-09 15:48:59

标签: perl mojolicious

我有以下代码:

$r->find('user')->via('post')->over(authenticated => 1);

鉴于该路由,我可以通过经过身份验证的检查到达用户路由 这是使用Mojolicious :: Plugin :: Authentication。

设置的

我想在那条路线上添加另一个“结束”。

$r->find('user')->via('post')->over(authenticated => 1)->over(access => 1);

虽然看起来会覆盖经过身份验证的'over'。

我尝试用以下名称分解路线:

 my $auth = $r->route('/')->over(authenticated => 1)
     ->name('Authenticated Route');

 $access = $auth->route('/user')->over(access => 1)->name('USER_ACCESS');

但这根本不起作用。这两个'过去都没有被访问。

我的路由是/ user,/ item,使用MojoX :: JSON :: RPC :: Service设置。 所以,我没有/ user /:id之类的东西来设置子路由。(不确定是否重要) 所有路线都像/ user,带参数发送。

我的情况如下:

$r->add_condition(
    access => sub {
        # do some stuff
    },
);

这是$ r-> route('/ user')中的'access' - > over(access => 1);

简而言之,使用时路线工作正常:

$r->find('user')->via('post')->over(authenticated => 1);

但我无法添加第二条路线。

那么,在设置具有多个条件的这些路线时我缺少什么? 是否可以将多个条件添加到单个route / route_name?

2 个答案:

答案 0 :(得分:2)

您可以在此over中同时使用这两个条件:

use Mojolicious::Lite;

# dummy conditions storing their name and argument in the stash
for my $name (qw(foo bar)) {
    app->routes->add_condition($name => sub {
        my ($route, $controller, $to, @args) = @_;
        $controller->stash($name => $args[0]);
    });
}

# simple foo and bar dump action
sub dump {
    my $self = shift;
    $self->render_text(join ' ' => map {$self->stash($_)} qw(foo bar));
}

# traditional route with multiple 'over'
app->routes->get('/frst')->over(foo => 'yo', bar => 'works')->to(cb => \&dump);

# lite route with multiple 'over'
get '/scnd' => (foo => 'hey', bar => 'cool') => \&dump;

# test the lite app above
use Test::More tests => 4;
use Test::Mojo;

my $t = Test::Mojo->new;

# test first route
$t->get_ok('/frst')->content_is('yo works');
$t->get_ok('/scnd')->content_is('hey cool');

__END__
1..4
ok 1 - get /frst
ok 2 - exact match for content
ok 3 - get /scnd
ok 4 - exact match for content

在这里使用perl 5.12.1上的Mojolicious 3.38可以正常工作 - @DavidO是对的,也许桥梁可以更好地完成工作。 :)

答案 1 :(得分:0)

如果我们使用这种方法怎么办?

# register condition
$r->add_condition(
    chain => sub {
        my ($route, $controller, $captures, $checkers) = @_; 

        for my $checker (@$checkers) {
            return 0 unless $checker->($route, $controller, $captures);
        }

        return 1;
    },
);

# ...
# example of using
$r->get('/')->over(chain => [\&checker1, \&checker2])->to(cb => \&foo)->name('bar');