2010-11-19 3 views
6

J'ai une grande liste d'anciennes routes que j'ai besoin de rediriger vers de nouvelles routes.Zend Framework: comment rediriger les anciennes routes vers de nouvelles routes personnalisées?

Je suis déjà en train de définir mes itinéraires personnalisés dans le Bootstrap:

protected function _initRoutes() 
{ 
    $router = Zend_Controller_Front::getInstance()->getRouter(); 

    $oldRoute = 'old/route.html'; 
    $newRoute = 'new/route/*'; 

    //how do I add a 301 redirect to the new route? 

    $router->addRoute('new_route', 
     new Zend_Controller_Router_Route($newRoute, 
      array('controller' =>'fancy', 'action' => 'route') 
    )); 
} 

Comment puis-je ajouter des itinéraires qui redirigent les vieilles routes en utilisant une redirection 301 vers les nouvelles routes?

+0

Pourquoi envoyer 301 lorsque vous faites pas redirect? D'après ce que je peux vous voir, faites juste la carte des anciennes routes vers les nouvelles sans redirection? – Fge

+0

désolé, mauvais exemple. J'essaie de rediriger, pas d'itinéraire. – Andrew

+0

J'ai mis à jour l'exemple pour être plus clair – Andrew

Répondre

7

Zend Framework ne possède pas ce type de fonctionnalité intégrée. J'ai créé un objet Route personnalisé afin de gérer ceci:

class Zend_Controller_Router_Route_Redirect extends Zend_Controller_Router_Route 
{ 
    public function match($path, $partial = false) 
    { 
     if ($route = parent::match($path, $partial)) { 
      $helper = new Zend_Controller_Action_Helper_Redirector(); 
      $helper->setCode(301); 
      $helper->gotoRoute($route); 
     } 
    } 
} 

Ensuite, vous pouvez l'utiliser lors de la définition de vos itinéraires:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initCustomRoutes() 
    { 
     $router = Zend_Controller_Front::getInstance()->getRouter(); 
     $route = new Zend_Controller_Router_Route_Redirect('old/route/*', array('controller'=>'content', 'action'=>'index'));  
     $router->addRoute('old_route', $route); 
    } 
} 
0

Il existe quelques approches pour résoudre ce problème.

Le plus facile est probablement juste utiliser votre fichier .htaccess pour faire un RewriteRule pattern substitution [R=301]

Vous pouvez également détecter quelle route a été utilisé dans le contrôleur et redirect basé sur ce point:

public function preDispatch() { 
    $router = $this->getFrontController()->getRouter(); 
    if ($router->getCurrentRouteName() != 'default') { 
    return $this->_redirect($url, array('code'=>301)); 
    } 
} 
9

Je l'ai fait comme ceci

  1. Ajouter une route Zend_Route_Regexp comme ancienne route
  2. Ajouter un automate et d'action pour l'ancienne route
  3. logique Ajouter à analyser ancienne route
  4. Ajouter $this->_redirect($url, array('code' => 301)) pour cette logique
+0

Je pense que c'est ce que je vais faire. Merci! – Andrew

0

La façon dont je l'habitude de le faire était de rediriger vers un contrôleur qui gère uniquement les redirections. Maintenant, j'utilise la classe personnalisée mentionnée dans mon autre réponse.

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initRoutes() 
    { 
     $router = Zend_Controller_Front::getInstance()->getRouter(); 

     //new routes 
     $router->addRoute('myroute', 
      new Zend_Controller_Router_Route_Static('/new/route/1234', 
       array('controller' =>'brands', 'action' => 'view', 'id' => '4') 
     )); 

     //old routes 
     $oldRoutes = array(
      '/old/route/number/1' => '/new/route/1234', 
     } 
     foreach ($oldRoutes as $oldRoute => $newRoute) { 
      $router->addRoute($oldRoute, new Zend_Controller_Router_Route_Static($oldRoute, array('controller' =>'old-routes', 'action' => 'redirect', 'new-route' => $newRoute))); 
     } 
    } 
} 

Et le contrôleur:

class OldRoutesController extends Zend_Controller_Action 
{  
    public function redirectAction() 
    { 
     $newRoute = $this->_getParam('new-route'); 
     return $this->_redirect($newRoute, array('code' => 301)); 
    } 
} 
2

Dans le contrôleur, essayez de cette façon:

 $this->getHelper('redirector')->setCode(301); 
    $this->_redirect(...); 
Questions connexes