@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。
小智 1
我发现以下之间的$c->uri_for区别$c->uri_for_action
考虑
__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)
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。