为什么Catalyst中的这种条件重定向不起作用?

时间:2011-04-04 18:22:39

标签: perl redirect catalyst

我有一个Catalyst应用程序,并希望根据条件语句重定向。我遇到了麻烦,我想知道是否有人可能会深入了解为什么这个看似简单的任务难以证明。

在我的Root.pm模块中,我有一个子begin,可以重定向到另一个网站,例如www.perl.org,但我无法重定向到我的应用程序中的页面。关于如何进行条件重定向的任何想法?

sub begin : Private {
    my ( $self, $c ) = @_;
    $c->stash->{client_id} = somenumber; # I'm setting this manually for testing

    $c->res->redirect('http://www.perl.org/') unless $c->stash->{client_id};
    $c->res->redirect('http://www.mysite.com/success') if $c->stash->{client_id}; #does not
}

1 个答案:

答案 0 :(得分:1)

也许你陷入无限循环,你的begin子将用户重定向到Catalyst应用程序中的另一个页面;一旦“将运行的控制器已被识别,但在调用任何URL匹配操作之前”(from the Catalyst::Manual::Intro man page),将再次调用begin,从而导致另一个重定向,依此类推。

尝试将此代码完全移出begin;也许,正如Htbaa所说,auto可能正是你所寻求的。标准$c->detach案例(在控制器controller中)是:

sub check_login :Local {
  # do something
  $c->detach('controller/login_successful') if($success);
  # display error message
}

sub login_successful :Local {
  # do something with the logged in user.
}

在这种情况下,执行$c->res->redirect('http://example.com/login_successful')也应该完美。希望有所帮助!