Разница между uri_for и uri_for_action - PullRequest
5 голосов
/ 27 марта 2012

В чем разница между $c->uri_for и $c->uri_for_action методами Catalyst.

Какой из них использовать?А почему?

Ответы [ 3 ]

4 голосов
/ 27 марта 2012

@ Девендра Я думаю, что твои примеры могут как-то вводить в заблуждение, если кто-то их читает.

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. Если позднее вы решите развернуть приложение в другом подкаталоге или в / вы все равно получите правильные ссылки.

Предположим, что ваше действие contact-us выглядит следующим образом: 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'), который вернет правильный URL.

4 голосов
/ 27 марта 2012

dpetrov_ в # катализаторе говорит:

Если пути могут измениться, uri_for_action - лучшая идея.

1 голос
/ 27 марта 2012

Я обнаружил ниже разницу между $c->uri_for и $c->uri_for_action

Рассмотрим

Othercontroller.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'));

}

Yourcontroller.pm

sub method_name: Local{

print "In Yourcontroller:: method_name"

}

В случае $c->uri_for URL-адрес изменяется на

http://localhost:3000/Hello/yourcontroller/method_name

Однако для $c->uri_for_action URL-адрес изменяется на

 http://localhost:3000/yourcontroller/method_name

Таким образом, пространство имен добавляется в случае uri_for.

...