суббота, 22 января 2011 г.

Catalyst. Генератор ссылок $c->uri_for Часть 1

Вольный перевод документации

$c->uri_for()

Одной из полезных способностей фреймворка Catalyst является способность тасовать страницами приложения не опасаясь что всё поломается, т.е. проще говоря, - болье нет проблем со ссылками в шаблонах страниц. Например, у вас есть приложение работающее по адресу http://www.domain.com/Calendar и у этого приложение большая вложенность "/Calendar/2010", "/Calendar/2011/01" и т.д. Если вы переносите своё приложение на другой домен, а может быть ещё вдобавок меняете расположение приложения отностительно корня "http://www.mydomain.com/Tool/Calendar" то раньше все ссылки ломались.


С функцией $c->uri_for() всё иначе. Это функция слияния вместе параметров запроса с базовым путём приложения и текущем пространством имён.

Несколько примеров:

<a href="[% c.uri_for('/Login') %]">Login Here</a>

В этом случае, если приложение установлено на http://www.domain.com/Calendar, то ссылка будет указывать на http://www.mydomain.com/Calendar/Login.
Хотя параметр начинается с косой черты, это не означает что он указывает на корень вэб-сервера, а указывает на корень приложения. Это важно! Если вы переместите ваше приложение в другой домен или по другому пути, то, ссылка все равно будет правильной.

<a href="[% c.uri_for('2010','10','24') %]"> 24 октября 2010 </a>

Первый параметр не имеет косой черты, и поэтому ссылка будет относительно текущего пространства имен. Если приложение установлено на http://www.domain.com/Calendar. и если шаблон вызывается из MyApp::Controller::Display, то ссылка будет такой http://www.domain.com/Calendar/Display/2010/10/24.

Если вы хотите добавить ссылку на родительский URI текущего пространства имен можно в качестве прификса добавить несколько '../':

<a href="[% c.uri_for('../../view', stashed_object.id) %]">User view</a>

Кроме того что такой подход к формированию ссылок позволяет перемещаться по приложению не беспокоясь о неработающих ссылках, есть кое что ещё. Т.к. ссылки генерирует uri_for() вы можете воспользоваться одним и тем же шаблоном из нескольких контроллеров и в этом случае каждый контроллер будет генерировать свои ссылки. Весьма удобно!

Вот собственно и всё. Это базовый минимум к пониманию того как пользоваться данным методом.

1 комментарий:

  1. Большое спасибо,кое что очень полезное раз и навсегда прояснил для себя.

    ОтветитьУдалить