Как создать foo.com/user в Zend?

Что ж, мне нужно сделать так, чтобы любой пользователь мог иметь 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.

Любая идея?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
415
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны иметь возможность определить свой маршрут имени пользователя (указанный выше маршрут регулярного выражения) и сначала добавить его в маршрутизатор, а затем просто добавить маршруты контроллера, например:

$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>.

Другие вопросы по теме