2010-09-09 1 views
4

Je développe une application en utilisant zend framework. Dans l'application, je dois fournir une URL pour chaque utilisateur comme mydomain.com/[username] alors le public pourra voir son profil. [nom d'utilisateur] est le nom d'utilisateur de l'utilisateur particulierComment obtenir une URL dynamique comme mydomain.com/username en utilisant zend framework

Mais comment puis-je y parvenir? Je pense que dans ZF mydomain.com/username essaie d'obtenir le contrôleur avec le nom nom d'utilisateur, mais je devrais montrer des profils d'utilisateur dans cette URL et il doit aller au contrôleur droit si quelque chose d'autre vient comme mydomain.com/controller1

+0

+1 Parce que c'est mon plus gros problème avec ZF (et d'autres fw aussi). Avec un moteur personnalisé, cela peut être facilement produit mais je n'ai jamais trouvé une bonne description de cette chose dans ZF par exemple. – fabrik

Répondre

0

Essayez d'utiliser Apache .htaccess mod_rewrite.

4) Réécriture yoursite.com/user.php?username=xyz à yoursite.com/xyz

Avez-vous vérifié zorpia.com.If vous tapez hxxp: //zorpia.com/roshanbh233 en navigateur, vous pouvez voir mon profil là-bas. Si vous voulez faire le même genre de redirection, c'est-à-dire

hxxp: //votresite.com/xyz à hxxp: //votresite.com/user.php? Username = xyz alors vous pouvez ajouter le code suivant à la. fichier htaccess.

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

source: http://roshanbh.com.np/2008/03/url-rewriting-examples-htaccess.html

+0

Est-ce que ce ZF est compatible? – fabrik

+0

J'utilise ZF :( – john

+0

pas sûr si elle est compatible ZF mais, en cas d'exécution de votre serveur Apache ... vous devriez être en mesure d'ajouter un fichier .htaccess à la racine, puis laisser Apache faire la magie ... –

1

Vous aurez besoin quelque chose de semblable à ce qui suit dans votre bootstrap

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

réponse de Chellini pourrait fonctionner, mais si vous avez 1000 utilisateurs que vous allez ajouter 1000 règles au routeur. Cela et l'accès à la base de données peuvent ajouter au temps de réponse de votre application.

Une alternative consiste à ajouter une route générique qui, par défaut, est mappée à l'action de l'utilisateur (définie en premier dans la mesure où les routes correspondent dans l'ordre inverse). Ensuite, ajoutez les routes aux contrôleurs que vous avez réellement - vous aurez probablement beaucoup moins de contrôleurs que d'utilisateurs.

Si votre application est modulaire, cela réduit le nombre de règles que vous devez écrire encore plus, car il vous suffit d'ajouter une règle pour un module.

2

Cela semble venir un peu, il y a quelques options:

Option 1: classe de route personnalisée

J'ai mis un billet de blog avec un exemple détaillé de la façon de parvenir à ZF en utilisant une classe de route personnalisée, voir:

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

cela pourrait ne pas être la méthode la plus simple, mais à mon avis, il est le meilleur, car il vous permet de configurer un usern Ame route comme un autre, et vous pouvez toujours utiliser les helpers ZF URL standard et autres jouets de routage.

Option 2: l'extension du routeur

Une autre approche consiste à étendre le routeur standard ZF et vérifiez un itinéraire nom d'utilisateur avant de faire quoi que ce soit d'autre.Quelque chose comme:

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); 
    } 
} 

Vous devez ensuite dire au contrôleur avant d'utiliser votre routeur au lieu de la valeur par défaut un, donc dans votre bootstrap:

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

remplacer « My » avec son propre espace de noms de votre application. Si vous suivez cette approche, vous ne pouvez pas utiliser l'assistant d'URL pour vos routes de nom d'utilisateur, et les choses peuvent devenir un peu brouillon si vous commencez à ajouter d'autres fonctionnalités personnalisées, alors utilisez plutôt la classe de routage personnalisée.

+0

Vous –

+0

Un routage personnalisé est exactement ce que j'ai suggéré.Veuillez voir l'article de blog que j'ai lié.L'échantillon de code montrant l'extension du routeur était juste une option alternative, la route personnalisée est meilleure (c'est pourquoi a écrit un article de blog entier à ce sujet). –

1

me semble que la difficulté ici est que vous utilisez le même schéma d'URL:

http:/example.com/something

pour représenter deux types d'actions:

  1. Si "quelque chose" représente un utilisateur nom, considérez ceci comme une requête à controller = user, action = viewProfile, param = quelque chose.
  2. Sinon, considérez ceci comme une demande standard au contrôleur SomethingController

Cela me semble un peu bizarre. Je préfère mettre les demandes des utilisateurs dans un autre schéma d'URL, comme:

http://example.com/user/bob

où les règles de routage standard peuvent appliquer. Vous voulez éviter le risque qu'un utilisateur s'enregistre avec un nom en conflit avec l'un de vos contrôleurs statiques. Bien sûr, vous pouvez gérer un pool de noms d'utilisateurs "réservés" pour vos contrôleurs statiques qui ne seraient pas disponibles pour les utilisateurs.

Mais si l'exigence est que le même format d'URL doit être utilisé pour les deux types de demandes, alors je ferais ce qui suit: acheminer toutes les demandes vers quelque chose comme TrafficCopController avec une action directTrafficAction(). L'action pourrait tester - probablement via une requête db - si le paramètre "something" transmis représente un utilisateur réel. Si c'est le cas, transmettez la demande à controller=user, action=viewProfile. Sinon, transmettez la demande à controller=something, action=index.

Voyez-vous ce que je veux dire?

1

Créer un personnalisé Route (pas de routeur, il n'est pas nécessaire de créer un routeur personnalisé!).

Votre nouvelle route doit étendre Zend_Controller_Router_Route_Abstract et remplacer la méthode match, qui prend Zend_Controller_Request_Abstract $request comme premier paramètre.

Dans votre nouvelle méthode de correspondance, interrogez simplement votre base de données pour voir si la page personnalisée, l'utilisateur, etc. existe en comparant avec $request->getRequestUri(), et si c'est le cas, renvoyez les informations de routage pertinentes. Exemple:

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

En cas d'échec (ne peut pas trouver l'utilisateur correct, ou une page, etc.), Puis:

return false 

Cela échelle beaucoup mieux que la création d'un itinéraire pour chaque utilisateur, et ne vous oblige pas à déranger le routage trop. Il fonctionnera toujours avec le routeur standard, et vous pouvez l'ajouter à vos routes via application.ini comme prévu.

Questions connexes