Управляем урлами или routing в symfony

Symfony framework

Автор: Александр Степанов

1 нояб. 2011 г., 10:05:01  942


Для своего сайта решил сделать красивые урлы, вроде как и для SEO лучше, да и для глаза приятней смотреть на красивые урлы. Как известно в symfony достаточно прописать в файле routing.yml желаемые урлы и все, но для symfony 1.1.4 это не очень помогло, тогда пришло в голову сделать так:

  • Прописываем в файле routing.yml желаемые урлы
  • Добавляем код в frontendConfiguration.class.php код.
  • Создаем свой собственный файл роутинга для каждого проекта.

Добавляем код в файл конфигурации

Во frontendConfiguration.class.php дописываем:

$this->dispatcher->connect('routing.load_configuration', array('frontendRouting', 'listenToRoutingLoadConfigurationEvent'));

Где:

  • frontendRouting — наш класс;
  • listenToRoutingLoadConfigurationEvent — наш метод, в котором будут прописаны нашы роуты.

Примерный вид listenToRoutingLoadConfigurationEvent class frontendRouting { /** * Listens to the routing.load_configuration event. * * @param sfEvent An sfEvent instance */ static public function listenToRoutingLoadConfigurationEvent(sfEvent $event) { $r = $event->getSubject(); $r->prependRoute('category', '/category/:category', array('module' => 'mainpage', 'action' => 'index')); $r->prependRoute('links', '/links', array('module' => 'links', 'action' => 'index')); $r->prependRoute('search', '/search', array('module' => 'search', 'action' => 'index')); $r->prependRoute('tags', '/tags', array('module' => 'Tags', 'action' => 'all')); $r->prependRoute('tag', '/tags/:tag', array('module' => 'mainpage', 'action' => 'tags')); $r->prependRoute('article', '/tags/:tag', array('module' => 'mainpage', 'action' => 'tags')); $r->prependRoute('pager', '/page', array('module' => 'mainpage', 'action' => 'index')); # Poll detail (form) route $r->prependRoute('sf_propel_polls_list','/polls', array('module' => 'sfPolls', 'action' => 'list')); $r->prependRoute('sf_propel_polls_detail', '/poll_detail/', array('module' => 'sfPolls', 'action' => 'detail')); $r->prependRoute('sf_propel_polls_results','/poll_results/', array('module' => 'sfPolls', 'action' => 'results')); $r->prependRoute('sf_propel_polls_vote', '/poll_vote', array('module' => 'sfPolls', 'action' => 'vote')); #ALL $r->prependRoute('rss','/rss', array('module' => 'mainpage', 'action' => 'rss')); $r->prependRoute('about','/about', array('module' => 'about', 'action' => 'index')); $r->prependRoute('contact', '/contact', array('module' => 'contact', 'action' => 'index')); } } Дальше наш класс лучше (для удобства) положить сюда:apps\frontend\lib

Так можно создавать роуты для многих проектов и они будут независимы друг от друга. Еще как вариант можно добавить свои роут в sfGuardRouting.class.php