在我的一个控制器中,我正在执行一些 SSE 异步流(请参阅此处),并且它在准系统测试项目中运行良好。在测试项目中,我没有设置默认视图,所以它似乎只是通过 - 完美!
现在我试图将它放入我现有的更大的项目中,但是,我发现将它转发到任何视图都会弄乱它,并且我不知道如何简单地跳过视图的渲染。因为我现在有一个默认视图,所以它拒绝直接通过。
我盲目地尝试了一些事情:$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 );
}
Run Code Online (Sandbox Code Playgroud)
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 执行任何操作。