2011-04-04 56 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')應該很好地工作爲好。希望有所幫助!