Как стать автором
Обновить

Тонкости роутинга в Zend Framework

Время на прочтение2 мин
Количество просмотров3.4K
Задача — сделать профиль пользователя доступным через example.com/user/username и через пользовательский поддомен username.example.com. Задача простая и с помощью Zend Framework решается парой строк кода. Трудности начались тогда, когда я решил действия регистрации, подтверждения регистрации, востановления пароля и собственно входа/выхода поместить в тот же контроллер, который выводит профиль пользователя. Теперь возникла задача научить контроллер не воспринимать example.com/user/register как пользователя.

Следуя документации, при определении роутера мы можем задать третим параметром требования к определенным в маршруте переменным в виде регулярного выражения.
Для решения поставленной задачи необходимо указать регулярное выражение "/^(?!register$|confirm$|recover$|login$|logout$).+$/", которое переводится как «строка с любым последующим от начала строки текстом, не содержащим строки register, confirm, recover, login, logout с последующим завершением строки» (Я всегда считал регулярки шаманством). Но ZF уже побеспокоился о нас, проставив обрамляющие символы, и символы начала и конца строки.

Итак, пусть у нас есть контроллер UserController. Этот контроллер содержит действие IndexAction, служащее для работы с профилем пользователя, а также действия, запускать которые нам необходимо игноруя маршрутизацию. Итоговый код:


  1. $routeUri = new Zend_Controller_Router_Route(
  2.   'user/:username',
  3.   array(
  4.     'controller' => 'user',
  5.     'action'   => 'index'
  6.   ),
  7.   array('username' => '(?!register$|confirm$|recover$|login$|logout$).+')
  8. );
  9. $router->addRoute('useruri', $routeUri);
  10.  
  11. $hostnameRoute = new Zend_Controller_Router_Route_Hostname(
  12.   ':username.example.com',
  13.   array(
  14.     'controller' => 'user',
  15.     'action'   => 'index'
  16.   ),
  17.   array('username' => '(?!www$|register$|confirm$|recover$|login$|logout$).+')
  18. );
  19. $plainPathRoute = new Zend_Controller_Router_Route_Static('');
  20. $router->addRoute('userdomain', $hostnameRoute->chain($plainPathRoute);
* This source code was highlighted with Source Code Highlighter.


Теперь при переходе по ссылке example.com/user/register ваш сайт не попытается искать и загружать профиль пользователя register

Кстати в архиве оффлайн мануала нашел два файлика от HtmlHelp, благодаря чему у меня теперь ман по ZF в удобном формате *.chm. Единственная тонкость в том, что компилятор htmlhelp не дружит с страшным представлением русских строк в виде HTML сущностей. :). Но эта проблема решается елементарным скриптиком:

  1.   $text=file_get_contents('toc.hhc');
  2.   
  3.   $dc=Array();
  4.   $ch=Array();
  5.   
  6.   for($i=1040; $i<=1103; $i++)
  7.   {
  8.     $dc[]='&#' . $i . ';';
  9.     $ch[]=chr($i-848);
  10.   }
  11.   
  12.   $text=str_replace($dc, $ch, $text);
  13.   
  14.   $h=fopen('_toc.hhc', 'w+');
  15.     fputs($h, $text);
  16.   fclose($h);
* This source code was highlighted with Source Code Highlighter.


Удачной маршрутизации и компиляции :)
Теги:
Хабы:
+7
Комментарии10

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн