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

Zend Framework
Задача — сделать профиль пользователя доступным через 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. $hostnameRoute = new Zend_Controller_Router_Route_Hostname(
  11. ':username.example.com',
  12. array(
  13. 'controller' => 'user',
  14. 'action' => 'index'
  15. ),
  16. array('username' => '(?!www$|register$|confirm$|recover$|login$|logout$).+')
  17. );
  18. $plainPathRoute = new Zend_Controller_Router_Route_Static('');
  19. $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. $dc=Array();
  3. $ch=Array();
  4. for($i=1040; $i<=1103; $i++)
  5. {
  6. $dc[]='&#' . $i . ';';
  7. $ch[]=chr($i-848);
  8. }
  9. $text=str_replace($dc, $ch, $text);
  10. $h=fopen('_toc.hhc', 'w+');
  11. fputs($h, $text);
  12. fclose($h);
* This source code was highlighted with Source Code Highlighter.


Удачной маршрутизации и компиляции :)
Теги:Zend Frameworkrouterregex
Хабы: Zend Framework
+7
3,2k 34
Комментарии 10

Похожие публикации

Лучшие публикации за сутки