捕获另一个动作的Catalyst响应主体

时间:2013-02-19 01:17:33

标签: perl catalyst

在我的一个页面上,我试图从另一个控制器中获取另一个页面的内容,然后使用该HTML并使用它在第一页上制作一个小“小部件”。

如果我抓住当前页面,我可以这么做:

my $html = $c->response->body();

但由于它在另一个控制器中,我无法弄清楚如何获得它。

另一个(潜在的)并发症是有问题的行为需要传递给它的arg。

我尝试my $html = $c->visit('/action/')->body(); - 在黑暗中拍摄 - 我在最近的另一篇文章中对此进行了排查。但这似乎只是接管了当前的行动,而不是让我只是从中获取响应。

我唯一能想到的(这是未经测试的)是存储第1页的响应,执行我的$c->visit,存储该响应,然后获取第1页的原始响应并在结束时输出该权限。似乎过于复杂,但这是我能想到的最好的。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

在看到这个之前我回答了your other question。我怀疑,我的答案的后半部分与此密切相关。

听起来像/ assets / widget中的逻辑需要位于Model而不是Controller中,因此它可以被任何需要它的函数使用。

和/或您需要将模板分解为(可重用)组件,以便您计划嵌入的任何内容都可以作为单个渲染过程的一部分完成。

[%- IF foo;
        PROCESS widget.tt;
    END; -%]

或者您对窗口小部件进行了不同的建模,以便不使其成为主页呈现的一部分,而是使用AJAX方法生成它们,以便每个窗口小部件都可以自己调用应用程序,获取一些JSON和渲染本身(可能是通过jQuery - 这个例子超出了问题的范围)。

希望有所帮助。

答案 1 :(得分:1)

Catalyst::Plugin::SubRequest可能会做你想要的。正如RET所说,重构你的应用程序可能更为谨慎,但在某些情况下渲染子请求可能很有用