2010-11-19 1 views
6

У меня есть большой список старых маршрутов, которые мне нужно перенаправить на новые маршруты.Zend Framework: Как перенаправить старые маршруты на новые пользовательские маршруты?

Я уже определяя свои собственные маршруты в 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') 
    )); 
} 

Как я могу добавить маршруты, которые перенаправляют старые маршруты, используя 301 редирект на новые маршруты?

+0

Почему посылая 301, когда не делать не редирект? Из того, что я вижу, вы просто сопоставляете старые маршруты с новыми без перенаправления? – Fge

+0

извините, плохой пример. Я пытаюсь перенаправить, а не маршрут. – Andrew

+0

Я обновил пример, чтобы быть более ясным. – Andrew

ответ

7

Zend Framework не имеет такой тип функций, встроенных в систему. Таким образом, я создал объект пользовательского маршрута для того, чтобы справиться с этим:

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

Затем вы можете использовать его при определении ваших маршрутов:

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

Существует несколько подходов к решению этой проблемы.

простой, вероятно, просто использовать файл .htaccess, чтобы сделать RewriteRule pattern substitution [R=301]

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

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

Я ve сделал это следующим образом

  1. Добавить маршрут Zend_Route_Regexp как старый маршрут
  2. Добавить контроллер и действие по старому маршруту
  3. Добавить логику для разбора старого маршрута
  4. Добавить $this->_redirect($url, array('code' => 301)) для этой логики
+0

Думаю, вот что я сделаю. Благодаря! – Andrew

0

То, как я это делал, было перенаправление на контроллер, который обрабатывал только перенаправления. Теперь я использую пользовательский класс, упомянутый в моем другом ответе.

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

И контроллер:

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

В контроллере, попробуйте так:

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