2011-01-07 3 views
1

Название этого вопроса было трудно найти, возможно, оно не лучшее.Zend Framework: как нарисовать полностью динамический маршрут

У меня есть сайт с регионами, категориями и поставщиками, очевидным решением является использование маршрута по умолчанию

"/:module/:controller/:action" 

Так что мои URL-адреса будет выглядеть как этот

"/region/midlands/category/fashion" 
"/region/midlands/supplier/ted-baker" 

Я желательно, чтобы это формат URL, как это, однако, это должно было бы включать запрос базы данных для проверки наличия midlands, fashion и ted-baker

"/midlands/fashion" 
"/midlands/ted-baker" 

Мое первоначальное решение было использовать что-то вроде этого

"/region/midlands/fashion" 

С маршрута определяется как

routes.category.route = "/region/:region/:category" 
routes.category.defaults.controller = category 
routes.category.defaults.action = index 
routes.category.defaults.module = default 
routes.category.defaults.category = false 
routes.category.defaults.region = false 

routes.supplier.route = "/supplier/:supplier" 
routes.supplier.defaults.controller = supplier 
routes.supplier.defaults.action = index 
routes.supplier.defaults.module = default 
routes.supplier.defaults.supplier = false 

Но это означает, что все префиксы с region или supplier. Мне почти нужно полностью захватить запрос с помощью вилки?

Каков наилучший способ достижения этого?

Спасибо за любую помощь.

Редактировать.

@ St.Woland, проблема в том, что я хочу этот маршрут

/:region/:supplier 

Для работы с этим URL

/midlands/ted-baker 

Но этот путь эффективно переопределяет маршрутизатор по умолчанию

ответ

0

Я использовал ErrorController, чтобы сделать это в конце. Я поймаю Исключение, где есть контроллер или нет маршрута, а затем действуйте соответствующим образом.

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

public function errorAction() 
{ 
    $errors = $this->_getParam('error_handler'); 

    switch ($errors->type) 
    { 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: 
      //Code for locating routes in Db goes here 
    } 
} 
2

The Лучший способ - добавить метод в ваш класс Bootstrap следующим образом:

<?php 
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initMyRoutes() 
    { 
     // First, initialize Database resource 
     $this->bootstrap('db'); 
     // Second, initialize Router resource 
     $this->bootstrap('router'); 

     // Finally, instantiate your database table with routes 
     $m_routes = new Model_Routes() ; 

     // Now get the Router 
     $router = $this->getResource('router'); 

     // ... and add all routes from the database 
     foreach($m_routes->fetchAll() as $route) { 
      $router->addRoute($route->name, new Zend_Controller_Router_Route($route->path, $route->toArray())) ; 
     } 
    } 
} 

Затем в application.ini:

[production] 
bootstrap.path = APPLICATION_PATH/Bootstrap.php 
bootstrap.class = Bootstrap 

Это будет инициализировать маршрутизатор с маршрутами из базы данных.

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

+0

Привет, Сент-Воланд, проблема заключается не в добавлении маршрутов. Это связано с тем, как лучше всего справляться с возможностью иметь несколько динамических маршрутов. См. Редактирование вопроса. –

+0

Все маршруты взяты в consuderation в порядке, противоположном тому, как вы их настроили. Таким образом, если ваш маршрут задан ПОСЛЕ по умолчанию, он будет согласован первым. Пожалуйста, укажите все маршруты и URL-адреса, которые будут соответствовать им, потому что неясно, чего вы хотите. Благодарю. –

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