как получить динамический URL, такой как mydomain.com/username, используя Zend Framework - PullRequest
4 голосов
/ 09 сентября 2010

Я разрабатываю приложение, используя Zend Framework. В приложении я должен предоставить URL для каждого пользователя, например, mydomain.com/[username], тогда публика сможет просмотреть его профиль. [username] - это имя пользователя конкретного пользователя

Но как мне этого добиться? Я думаю, что в ZF mydomain.com/username пытается получить контроллер с именем username , но я должен показать профили пользователей в этом URL, и он должен перейти к правильному контроллеру, если что-то еще придет, как mydomain.com/ controller1

Ответы [ 6 ]

3 голосов
/ 09 сентября 2010

Похоже, это совсем немного, есть несколько вариантов:

Вариант 1: пользовательский класс маршрута

Я разместил пост в блоге с подробным примером того, как добиться этого в ZF с помощью пользовательского класса маршрута, см .:

http://tfountain.co.uk/blog/2010/9/9/vanity-urls-zend-framework

Возможно, это не самый простой подход, но, на мой взгляд, он самый лучший, поскольку он позволяет вам настроить маршрут имени пользователя, как и любой другой, и вы все равно можете использовать стандартные помощники ZF URL и другие игрушки маршрутизации.

Вариант 2: расширение маршрутизатора

Другой подход заключается в расширении стандартного маршрутизатора ZF и последующей проверке маршрута имени пользователя, прежде чем делать что-либо еще. Что-то вроде:

class My_Router extends Zend_Controller_Router_Rewrite
{
    public function route(Zend_Controller_Request_Abstract $request)
    {
        $pathBits = explode('/', $request->getPathInfo());
        if (!empty($pathBits[0])) {
            // check whether $pathBits[0] is a username here
            // with a database lookup, if yes, set params and return
        }

        // fallback on the standard ZF router
        return parent::route($request);
    }
}

Затем вам нужно указать фронт-контроллеру использовать ваш маршрутизатор вместо используемого по умолчанию, так что в вашей начальной загрузке:

protected function _initRoutes()
{
    Zend_Controller_Front::getInstance()->setRouter(new My_Router());
}

замените 'My' собственным пространством имен вашего приложения.

Если вы будете следовать этому подходу, вы не сможете использовать URL-помощник для маршрутов вашего имени пользователя, и все может стать немного запутанным, если вы начнете нуждаться в добавлении других пользовательских функций, поэтому используйте вместо этого собственный класс маршрута.

1 голос
/ 02 октября 2010

Создание пользовательского Маршрута (не Маршрутизатор; создавать настраиваемый маршрутизатор не нужно!).

Ваш новый маршрут должен быть расширен Zend_Controller_Router_Route_Abstract и переопределить matchметод, который принимает Zend_Controller_Request_Abstract $request в качестве первого параметра.

В вашем новом методе сопоставления просто запросите базу данных, чтобы узнать, существует ли пользовательская страница, пользователь и т. д., сравнивая с $request->getRequestUri(), и если этовозвращает соответствующую информацию о маршрутизации.Пример:

return array(
    'module'     => 'default',
    'controller' => 'users',
    'action'     => 'view',
    'user'       => $user
);

При ошибке (не удается найти правильного пользователя или страницу и т. Д.), Затем:

return false

Это масштабируется значительно лучше, чем создавать маршрут для каждого отдельного пользователя, и не требует от вас слишком много возиться с маршрутизацией.Он по-прежнему будет работать со стандартным маршрутизатором, и вы можете добавить его к своим маршрутам через application.ini, как и ожидалось.

1 голос
/ 10 сентября 2010

Мне кажется, что сложность заключается в том, что вы используете ту же схему URL:

http:/example.com/something

для представления двух типов действий:

  1. Если «что-то» представляет имя пользователя, считайте это запросом контроллера = пользователя, действия = viewProfile, param = что-то.
  2. В противном случае рассмотрим это как стандартный запрос к контроллеру SomethingController

Это кажется мне немного странным. Я бы предпочел поместить запросы пользователей в другую схему URL, например:

http://example.com/user/bob

где могут применяться стандартные правила маршрутизации. Хотите избежать риска того, что пользователь зарегистрируется с именем, которое конфликтует с одним из ваших статических контроллеров. Конечно, вы могли бы поддерживать пул «зарезервированных» имен пользователей для ваших статических контроллеров, которые были бы недоступны для выбора пользователями.

Но если действительно требуется, чтобы один и тот же формат URL использовался для обоих типов запросов, я бы сделал следующее: перенаправил бы все запросы на что-то вроде TrafficCopController с действием directTrafficAction(). Действие может проверить - возможно, с помощью запроса базы данных - если переданный параметр «что-то» представляет реального пользователя. Если это так, то перенаправьте запрос на controller=user, action=viewProfile. В противном случае направьте запрос на номер controller=something, action=index.

.

Видишь, о чем я?

1 голос
/ 09 сентября 2010

Вам понадобится нечто похожее на следующее в вашей начальной загрузке

public function _initRouter()
{
     $router = Zend_Controller_Front::getinstance()->getRouter();
     $users = array() // get the usernames from DB or wherever you have them

      // Adds some routes
     foreach($users as $user)
     {
        $router->addRoute($user['name'], new Zend_Controller_Router_Route($user['name'].'/:controller/:action/*', array(
          'module' => 'users', // module name
          'controller' => 'index', // controller name
          'action' => 'profile', // action name
          'username' => $user['name']))); // user name
      }
      return $router;
    }
}
0 голосов
/ 09 сентября 2010

Ответ Челлини может сработать, но если у вас 1000 пользователей, вы добавите 1000 правил к маршрутизатору. Это и доступ к базе данных могут увеличить время отклика вашего приложения.

Альтернативой является добавление общего маршрута, который по умолчанию отображается на действие пользователя (это определяется в первую очередь, когда маршруты сопоставляются в обратном порядке). Затем добавьте маршруты к тем контроллерам, которые у вас есть - у вас, вероятно, будет гораздо меньше контроллеров, чем у пользователей.

Если ваше приложение является модульным, это уменьшает количество правил, которые вы должны написать, еще больше, поскольку вам просто нужно добавить одно правило для модуля.

0 голосов
/ 09 сентября 2010

Попробуйте использовать Apache .htaccess mod_rewrite.

4) Перезапись yoursite.com/user.php?username=xyz на yoursite.com/xyz

Проверяли ли вы zorpia.com.Если вы наберете hxxp: //zorpia.com/roshanbh233 в браузере, вы можете увидеть мой профиль там.Если вы хотите сделать такой же тип перенаправления, т.е.

hxxp: //yoursite.com/xyz на hxxp: //yoursite.com/user.php? Username = xyz, то вы можете добавить следующий код вфайл .htaccess.

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ user.php?username=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ user.php?username=$1

источник: http://roshanbh.com.np/2008/03/url-rewriting-examples-htaccess.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...