perl - Mojolicious 动态路由 Action 取决于状态

标签 perl mojolicious

我正在使用 Mojolicious::Plugin::Authentication 来处理我的应用程序中的身份验证。我正在尝试为斜杠 '/' 设置一个路由,如果经过身份验证,它将有一个 Controller / Action ,如果没有,则另一个(即,根据是否通过身份验证,您会转到不同的页面。)我不确定如何实现这一目标。以下是我尝试过的一些事情:

$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。我可以轻松设置 session token 并自行检查。无论哪种方式,问题仍然存在:如何为给定路线创建动态操作?

附录

忘了补充,我也试过这个:
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');
    }
});

这确实很好用。但是,我仍然很好奇是否可以根据状态为给定路由设置不同的 Controller /操作。

最佳答案

Mojo hooks 正是你要找的,一个非常强大的功能,对身份验证特别有用:

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

您可能需要查看 before_dispatch()

希望这可以帮助。

关于perl - Mojolicious 动态路由 Action 取决于状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26742756/

相关文章:

arrays - 在 perl 中为数组内的所有元素添加引号

mysql - PERL PAR 打包程序 MYSQL libmysql_.dll

perl - 我怎样才能在另一个模块中模拟一个子模块?

xml - 在以 XML 模式使用 Mojo::DOM 的 Perl 中,如何匹配子标签的内容?

perl - 部署多个 mojolicious 应用实例

javascript - mojolicious 将数组分配给 JavaScript 变量

Perl Mojolicious EventSource gzip 输出

perl - 我应该如何比较 Perl 引用文献?

Perl 兼容性

perl - '->to()' 可以在 Mojolicious::Lite 中使用吗?