Задача — сделать профиль пользователя доступным через 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, служащее для работы с профилем пользователя, а также действия, запускать которые нам необходимо игноруя маршрутизацию. Итоговый код:
Теперь при переходе по ссылке example.com/user/register ваш сайт не попытается искать и загружать профиль пользователя register
Кстати в архиве оффлайн мануала нашел два файлика от HtmlHelp, благодаря чему у меня теперь ман по ZF в удобном формате *.chm. Единственная тонкость в том, что компилятор htmlhelp не дружит с страшным представлением русских строк в виде HTML сущностей. :). Но эта проблема решается елементарным скриптиком:
Удачной маршрутизации и компиляции :)
Следуя документации, при определении роутера мы можем задать третим параметром требования к определенным в маршруте переменным в виде регулярного выражения.
Для решения поставленной задачи необходимо указать регулярное выражение "/^(?!register$|confirm$|recover$|login$|logout$).+$/", которое переводится как «строка с любым последующим от начала строки текстом, не содержащим строки register, confirm, recover, login, logout с последующим завершением строки» (Я всегда считал регулярки шаманством). Но ZF уже побеспокоился о нас, проставив обрамляющие символы, и символы начала и конца строки.
Итак, пусть у нас есть контроллер UserController. Этот контроллер содержит действие IndexAction, служащее для работы с профилем пользователя, а также действия, запускать которые нам необходимо игноруя маршрутизацию. Итоговый код:
- $routeUri = new Zend_Controller_Router_Route(
- 'user/:username',
- array(
- 'controller' => 'user',
- 'action' => 'index'
- ),
- array('username' => '(?!register$|confirm$|recover$|login$|logout$).+')
- );
- $router->addRoute('useruri', $routeUri);
-
- $hostnameRoute = new Zend_Controller_Router_Route_Hostname(
- ':username.example.com',
- array(
- 'controller' => 'user',
- 'action' => 'index'
- ),
- array('username' => '(?!www$|register$|confirm$|recover$|login$|logout$).+')
- );
- $plainPathRoute = new Zend_Controller_Router_Route_Static('');
- $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 сущностей. :). Но эта проблема решается елементарным скриптиком:
- $text=file_get_contents('toc.hhc');
-
- $dc=Array();
- $ch=Array();
-
- for($i=1040; $i<=1103; $i++)
- {
- $dc[]='&#' . $i . ';';
- $ch[]=chr($i-848);
- }
-
- $text=str_replace($dc, $ch, $text);
-
- $h=fopen('_toc.hhc', 'w+');
- fputs($h, $text);
- fclose($h);
* This source code was highlighted with Source Code Highlighter.
Удачной маршрутизации и компиляции :)