Что ж, мне нужно сделать так, чтобы любой пользователь мог иметь foo.com/username на моем сайте, где я использую среду Zend.
Дело в том, что я хочу, чтобы foo.com/login и другие контроллеры продолжали работать так, как они, поэтому я уже подтверждаю, что ни один пользователь не может быть назван одним из контроллеров, которые я собираюсь использовать. Невозможно изменить htaccess или не работает конфигурация mvc. Итак, я использую роутер.
Я знаю, что если я использую что-то вроде:
$routes = array();
$routes['entry'] = new Zend_Controller_Router_Route_Regex('SOME REGEX HERE',
array(
'controller' => 'profile',
'action' => 'show'
),
array(
'id' => "dsadsa", // maps first subpattern "(\d+)" to "id" parameter
1 => 'id' // maps first subpattern "(\d+)" to "id" parameter
)
);
$router->addRoutes($routes);
Я могу сделать так, чтобы все, что соответствует регулярному выражению, перенаправлялось, но я не знаю, есть ли лучший способ (каким-то образом объединить 2 маршрутизатора), где мне не нужно фактически перечислять мои контроллеры в очень-очень большом OR.
Любая идея?





Вы должны иметь возможность определить свой маршрут имени пользователя (указанный выше маршрут регулярного выражения) и сначала добавить его в маршрутизатор, а затем просто добавить маршруты контроллера, например:
$router->addRoute('user',
new Zend_Controller_Router_Route('controller/:var'));
Zend попытается сопоставить запрос с определенными маршрутами в обратном порядке. Если I request не соответствует одному из ваших маршрутов контроллера, он попытается сопоставить его с вашим маршрутом регулярного выражения.
Примерно так должно работать:
$routes = array();
$routes['entry'] = new Zend_Controller_Router_Route(
':userName',
array(
'controller' => 'profile',
'action' => 'show'
)
);
Затем добавьте все ваши другие маршруты, для / login, / logout и т. д. Как сказал Тим, Zend сопоставляет маршруты в обратном порядке, поэтому он попытается сопоставить с вашим «белым списком» маршрутов, прежде чем окончательно отправить его на ваше «имя пользователя» " маршрут.
Это нарушит любой тип проверки ошибок, выполняемый Zend, чтобы убедиться, что контроллер / действие существует, поскольку все будет перенаправлено в / profile / show, если нет совпадений маршрута.
Однако всего этого можно было бы легко избежать, если бы вы могли иметь дело только с foo.com/user/ <username>.