Catalyst - 如何跳过呈现视图

时间:2014-05-29 05:16:24

标签: perl catalyst

在我的一个控制器中,我正在做一些SSE异步流(参见here),并且我在一个准系统测试项目中工作得很好。在测试项目中,我没有默认的视图集,所以它似乎只是通过 - 完美!

现在我正在尝试将它放入我现有的大型项目中,但是,我发现将它转发到任何视图会使它混乱,我无法弄清楚如何简单地跳过视图的渲染。因为我现在有一个默认视图,所以它拒绝直接通过。

我盲目地尝试了一些事情:$c->detach$c->forward(undef),覆盖了“结束”方法。没有成功跳过视图渲染 - 它总是将其传递给我的默认视图。

有什么想法吗?

修改

不是超级相关,但有问题的行动:

sub time_server : Path('/events') {
    my ( $self, $c ) = @_;
    $c->res->content_type('text/event-stream');
    $timer_model->( $c, $c->response->write_fh );
}

2 个答案:

答案 0 :(得分:4)

Catalyst::Action::Renderview在决定是否调用视图时使用一小组标准。如果出现以下情况,它将跳过运行视图:

  • 请求是HEAD请求。
  • 某些内容已将$c->response->body设置为已定义的值。
  • $c->response->status设置为204("无内容")或任何3xx(重定向)。
  • $c->error包含一个或多个错误,并且$c->stash->{template}尚未设置(因此finalize_error可以完成其工作)。

老实说,这不是最好的安排,但我会尝试在你的$c->res->body("");行动中设置time_server。一个空的身体不会写任何东西,你的标题已经完成,因为你已经调用了write_fh,但仍然定义了一个空字符串,这样它就不会让RenderView做任何事情。< / p>

答案 1 :(得分:1)

这是我的解决方案,用于强制使用默认的Catalyst控制器响应JSON类型的功能。您应该将内容类型更改为流。 希望它能对您有所帮助。

sub my_function{
    my ( $self, $c ) = @_;
    
    my $payload = {
        "yourkey" => "backtooldschool",
        "yourkey2" => "2020"
    };
    my $result = encode_json($payload);

    $c->response->body($result);
    $c->response->content_type('application/json');
    $c->response->status(200);
}