2012-03-27 4 views
0

Я создаю приложение Zend Framework 1.11.11 и хотел бы, чтобы маршруты и база данных содержали данные.Zend Framework - Router - создание псевдонимов

Я написал плагин FrontController, который извлекает «пути» из базы данных и создает запись в Router для каждого из них, с соответствующим контроллером и действием.

Однако, я хотел бы иметь возможность использовать «псевдонимы» - URL-адрес, который ведет себя как обычный URL-адрес, но является псевдонимом.

Например, если я создаю следующее:

// Create the Zend Route 
$entry = new Zend_Controller_Router_Route_Static(
    $route->getUrl(), // The string/url to match 
    array('controller' => $route->getControllers()->getName(), 
      'action' => $route->getActions()->getName()) 
);      
// Add the route to the router 
$router->addRoute($route->getUrl(), $entry); 

Затем маршрут /about/, например, может Гото в staticController, indexAction.

Однако, как лучше всего создать псевдоним этого маршрута? Итак, если бы я отправился в /abt/, он отобразил бы тот же контроллер и действие?

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

ответ

1

вы можете расширить статический маршрутизатор:

class My_Route_ArrayStatic extends Zend_Controller_Router_Route_Static 
{ 
    protected $_routes = array(); 

    /** 
    * Prepares the array of routes for mapping 
    * first route in array will become primary, all others 
    * aliases 
    * 
    * @param array $routes array of routes 
    * @param array $defaults 
    */ 
    public function __construct(array $routes, $defaults = array()) 
    { 
     $this->_routes = $routes; 
     $route = reset($routes); 
     parent::__construct($route, $defaults); 
    } 

    /** 
    * Matches a user submitted path with a previously specified array of routes 
    * 
    * @param string $path 
    * @param boolean $partial 
    * @return array|false 
    */ 
    public function match($path, $partial = false) 
    { 
     $return = false; 

     foreach ($this->_routes as $route) { 
      $this->setRoute($route); 
      $success = parent::match($path, $partial); 
      if (false !== $success) { 
       $return = $success; 
       break; 
      } 
     } 

     $this->setRoute(reset($this->_routes)); 
     return $return; 
    } 

    public function setRoute($route) 
    { 
     $this->_route = trim($route, '/'); 
    } 
} 

и добавить новый маршрутизатор таким образом:

$r = My_Route_ArrayStatic(array('about', 'abt'), $defaults); 
+0

Спасибо за ваш ответ - пожалуйста, не могли бы вы обновить его с комментариями? – Sjwdavies

+0

Я добавил несколько дополнительных комментариев, в основном это просто метод сопоставления match(), который позволяет сопоставлять $ path с массивом URL-адресов. –

+0

Спасибо - это, похоже, для достижения нужного мне результата. Я был бы признателен, если бы вы могли более подробно объяснить свой ответ? – Sjwdavies

Смежные вопросы