通过$ c->访问Args向下催化剂链

时间:2013-02-18 00:06:34

标签: perl catalyst

在我的一个Catalyst操作中,我试图在另一个控制器中获取另一个操作的正文响应(HTML)。 (出于将一页“嵌入”另一页的目的)

我认为这样做的方法是$c->visit。 (如果我误解了$ c->访问,那么我的问题的其余部分无需回答。)

有问题的行动采取了一个arg,但直到链的下游,这看起来像这样:

/equipment/*/assets/widget


/assets/captureID (1)
-> /assets/base (0)
-> /assets/pageData (0)
=> /assets/widget

如您所见,只有链中的最后一个动作正在寻找一个arg。

如果我尝试:

$c->visit('/assets/widget',[$arg]);

我希望它能够沿着链条传递并给出/ assets / captureID我的$ arg。但事实上,它似乎根本没有传递到链条上。

我哪里误入歧途?

2 个答案:

答案 0 :(得分:1)

只显示捕获,而不是args传递到链中。

根据文件:

  

$ c->访问($ action [,\ @captures,\ @arguments])

所以我通过以下方式取得了成功:

$c->visit('/assets/widget',[$arg],[$arg])

第一个args数组击中第一个动作并停止,但第二个数组一直沿着链条传播,就像我想要的那样。

我希望$c->visit('/assets/widget',[],[$arg])可以正常工作,但事实并非如此。

然而,毕竟我意识到我不能只是抓住身体的反应,这是最终的目标。无论哪种方式,希望我的追逐对某人有帮助。

答案 1 :(得分:1)

正如您所发现的,那时身体并不存在。您必须打电话来渲染视图,或者安排/ assets / widget直接设置$c->res->body($foo)。我认为抓住一个非传统的子请求的主体的想法,温和地说。我无法想象你将如何处理它不会违背良好的MVC设计原则。

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

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

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