【问题标题】:Why does this conditional redirect in Catalyst not work?为什么 Catalyst 中的这种条件重定向不起作用?
【发布时间】:2011-04-04 18:22:38
【问题描述】:

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

【问题讨论】:

  • 您知道ifunless 之间的区别吗?另外,你知道一个值何时计算为真或假吗?
  • 是的,我知道 if 和 unless 之间的区别。在我上面的例子中,我说的是 www.perl.org,除非是数字(假)。如果数字(真)重定向到我的网站。 $C-detach 对我也不起作用。我认为这可能与开始一次又一次地被调用有关。所以我想知道如何根据条件语句访问我网站中的另一个页面。
  • 一、somenumber的值是多少?
  • 我刚刚用值 1 和 0 对其进行了测试,它的行为符合预期。还有你的例子。您使用的是什么版本的 Catalyst?我用 5.80025 测试过。
  • 嗯,我认为您需要问自己是否应该在auto 中执行此操作,尤其是因为您不想重定向到某些外部站点。这是因为 auto 对于正在执行的每个操作都会自动运行。因此,您在 auto 子中重定向,这使应用程序执行一个新请求,该请求运行 auto,因此循环继续。另外,我相信您需要在重定向后始终$c->detach,否则它会执行其余的子程序。

标签: perl redirect catalyst


【解决方案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') 也应该可以正常工作。希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 2017-06-12
    • 2016-05-14
    • 1970-01-01
    • 2016-09-13
    • 2017-02-17
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    相关资源
    最近更新 更多