uri_for和uri_for_action之间的区别

5 perl catalyst

Catalyst 之间有什么区别$c->uri_for$c->uri_for_action方法.

哪一个使用?为什么?

Dim*_*rov 5

@Devendra 我认为如果有人阅读您的示例,它们可能会以某种方式产生误导。

uri_for 需要路径(而不是动作)。它返回一个绝对 URI 对象,因此例如它对于链接到静态内容或在您不希望路径更改的情况下很有用。

因此,例如,让说你已经部署了你的应用程序域example.com和子目录ABC(example.com/abc/):$c->uri_for('/static/images/catalyst.png')将example.com/abc/static/images/catalyst.pn返回,或例如:$c->uri_for('/contact-us-today')将返回example.com/abc/contact-us-today。如果您稍后决定将您的应用程序部署在另一个子目录下或 / 下,您仍然会得到正确的链接。

假设您的联系我们操作如下所示:sub contact :Path('/contact-us-today') :Args(0) {...}然后您决定 /contact-us-today 应该只是 /contact-us。如果您使用过uri_for('/contact-us-today'),则需要查找并更改指向此 url 的所有行。但是,您可以使用$c->uri_for_action('/controller/action_name')which 将返回正确的 url。

  • `uri_for` 也适用于动作,即 `$c->uri_for('/​​controller/action_name');` 也可以工作。这实际上是问题。我找不到它们之间的任何区别 (`uri_for` 和 `uri_for_action` ) 除了“命名空间”之外的行为/工作。请检查并回复。 (2认同)

小智 1

我发现以下之间的$c->uri_for区别$c->uri_for_action

考虑

其他控制器.pm

__PACKAGE__->config(namespace => 'Hello');

.  
.   
.  

sub bar: Local{

$c->res->redirect($c->uri_for('yourcontroller/method_name'));

$c->res->redirect($c->uri_for_action('yourcontroller/method_name'));

}
Run Code Online (Sandbox Code Playgroud)

你的控制器.pm

sub method_name: Local{

print "In Yourcontroller:: method_name"

}
Run Code Online (Sandbox Code Playgroud)

如果$c->uri_forurl 更改为

http://localhost:3000/Hello/yourcontroller/method_name
Run Code Online (Sandbox Code Playgroud)

但是对于$c->uri_for_actionurl 更改为

 http://localhost:3000/yourcontroller/method_name
Run Code Online (Sandbox Code Playgroud)

因此,在 的情况下会添加命名空间uri_for