【问题标题】:Catalyst: Passing query param to a "forward" callCatalyst:将查询参数传递给“转发”调用
【发布时间】:2020-03-15 02:06:43
【问题描述】:

我有一个 Catalyst 控制器,它以通常的方式 (/endpoint/foo/bar) 响应参数,但也接受一个安全令牌的查询参数。在我发起对这个控制器的forward 调用之前,如何设置参数的值?它不允许我分配给$c->req->param('token')

(不可能重写控制器以接受令牌作为参数而不是参数。)

【问题讨论】:

  • 你是说你想修改请求,所以你可以正确使用这个 3rd 方控制器?因为它不需要控制器参数。对吗?
  • 不完全是,但它或多或少需要以这种方式工作。它确实需要控制器参数,但它也需要一个查询参数。我真正需要做的是对这个Controller发起一个新的请求;我将拥有查询参数的参数和值,我需要将它们发送给控制器。

标签: perl catalyst


【解决方案1】:

$c->req->param('token') 不是 LValue,因此您不能 分配 给它。相反,您需要to pass in the value

$c->req->param('token', 1);

这种行为是有记录的:

与 CGI 类似,但与 Catalyst 的早期版本不同,它传递多个 此方法的参数,如下所示:

 $c->request->param( 'foo', 'bar', 'gorch', 'quxx' );

将参数 foo 设置为多个值 bar、gorch 和 quxx。 以前这会将 bar 添加为 foo 的另一个值(创建 如果它以前不存在则它),quxx 作为 gorch 的另一个值。

考虑这个演示:

package MyApp::Controller::Root;
use base 'Catalyst::Controller';
__PACKAGE__->config(namespace => '');

sub default : Path {
    my ($self, $c) = @_;
    $c->req->param('foo', 1);
    $c->forward('bar');
}

sub bar : Path('foo') {
    my ($self, $c) = @_;

    if ($c->req->param('foo')) {
        $c->res->body("Secret param set!\n");
    }
    else {
        $c->res->body("Hello World\n");
    }
    return;
}

【讨论】:

  • 啊,太好了,谢谢。我确实看到了文档的那个部分,但它不仅令人困惑,而且还充斥着关于这是不安全且将被弃用的警告,所以我没有仔细查看。
  • @user1235777 这不是一个很好的解决方案,但我猜它必须这样做。
猜你喜欢
  • 2017-09-27
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2013-08-02
  • 2017-03-08
相关资源
最近更新 更多