2011-04-04 30 views
4

我有一个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 
} 
+0

您是否知道'if'和'unless'之间的区别?另外,你知道一个值的计算结果是真是假吗? – Htbaa 2011-04-04 18:27:14

+0

是的,我知道if和unless之间的区别。在我上面的例子中,我说的是去了www.perl.org,除非有一个数字(假的)。重定向到我的网站如果一个数字(真)。 $ C分离也不适用于我。我认为这可能与开始被一次又一次地呼叫有关。所以我想知道如何根据条件语句到达我网站中的另一个页面。 – CodeWriter 2011-04-04 18:34:48

+0

首先,'somenumber'的价值是什么? – Htbaa 2011-04-04 18:43:35

回答

1

也许你陷入无限循环,在你的begin子用户到另一个页面重定向在催化剂的应用;一旦“将运行的控制器已被识别,但在调用任何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')应该很好地工作为好。希望有所帮助!