根据状态动态的动态路线动作

时间:2014-11-04 18:50:02

标签: perl mojolicious

我正在使用Mojolicious :: Plugin :: Authentication来处理我的应用中的身份验证。我正试图建立一条斜线的路线' /'如果经过身份验证,则会有一个控制器/操作,如果没有,则会有另一个控制器/操作(即,根据您是否经过身份验证,您将转到另一个页面。)我不确定如何实现此目的。以下是我尝试过的一些事情:

$r->any('/')->to(cb => sub {
    my $self = shift;

    if ( $self->is_user_authenticated ) {
      $self->redirect_to('member#index');
    }
    else {
      $self->redirect_to('guest#index');
    }
});

和...

my $logged_in = $r->under (sub {
    my $self = shift;

    if (!$self->session("username")) {
        return undef;
    }
    else {
        return 1;
    }
});

if ( $logged_in ) {
    $logged_in->get('/')-to(controller => 'Member', action => 'index');
}
else {    
    $r->get('/')->to(controller => 'Guest', action => 'index');
}

我不必使用Mojolicious :: Plugin :: Authentication。我可以轻松设置会话令牌并自行检查。无论哪种方式,问题仍然存在:如何为给定路线创建动态动作?

附录

忘记添加,我也尝试了这个:

my $auth = $r->under('/' => sub {
    my $self = shift;

    # Authenticated
    return 1 if $self->is_user_authenticated;

    # Not authenticated
    return undef;
});

$auth->get('/')->to('member#index');

# Routes related to non-members
$r->get('/')->to('guest#index');

添加其他详细信息

我只想添加,我可以基于状态渲染或重定向到不同的东西,例如,

$r->any('/')->to(cb => sub {
    my $self = shift;

    if ( $self->is_user_authenticated ) {
      $self->render('member/index');
    }
    else {
      $self->render('guest/login');
    }
});

这确实很有效。但是,我仍然很好奇是否可以根据状态为给定路线设置不同的控制器/动作。

1 个答案:

答案 0 :(得分:3)

Mojo挂钩是您正在寻找的,一个非常强大的功能,对身份验证特别有用:

http://mojolicio.us/perldoc/Mojolicious#HOOKS

您可能需要查看before_dispatch()

希望这有帮助。