Учебные пособия для маршрутизации на основе базы данных в Zend Framework?
Я работаю над проектом, который должен использовать схему MVC, управляемую базой данных, где маршрут к контроллерам и представлениям управляется через одну таблицу базы данных. Однако я не смог найти никаких учебных пособий, демонстрирующих это с текущей версией фреймворка (кажется, что все они были написаны несколько версий назад), и мне было интересно, если кто-нибудь сделал что-то подобное с более свежей версией или если кто-то знает о блогах или учебных пособиях, в которых обсуждается, как сделать это простым способом.
Основная идея заключается в том, что будет таблица sitePage, которая будет содержать поля pageName, controller, module и view. Когда запрос обрабатывается, мне нужно запросить в базе данных заданное имя страницы и определить соответствующий контроллер, модуль и представление, а затем передать его в необходимый класс Zend, чтобы продолжить обычную маршрутизацию и обработку запроса.
Заранее спасибо.
3 ответа
Я понял, что более элегантный подход - это использование маршрутизатора, но для этого вам нужно создать собственный, расширив класс Zend_Controller_Router_Abstract и реализовав метод route.
Вы получаете объект Zend_Controller_Request_Abstract в качестве параметра метода "route". Там вы можете поговорить с базой данных, а затем вы можете использовать:
Zend_Controller_Request_Abstract::setModuleName(),
Zend_Controller_Request_Abstract::setControllerName(),
Zend_Controller_Request_Abstract::setActionName()
определить свой маршрут.
Я надеюсь, что это помогает!
Вы также можете использовать метод routeStartup() в вашем плагине. например:
class My_Plugin_PageRoute extends Zend_Controller_Plugin_Abstract {
public function routeStartup () {
$front = Zend_Controller_Front::getInstance();
$pages = new Model_Pages();
$page_data = $pages ->getPageInfo();
$router = $front->getRouter();
foreach($page_data as $page) {
$r = new Zend_Controller_Router_Route(
'' . $page -> page_name,
array('controller' => 'pages',
'action' => 'index',
'page_id' => $page -> page_id)
);
$router->addRoute('pages_' . $page -> page_id, $r);
}
}
}
Возможно, лучшим подходом является не использование маршрутизаторов, а использование плагинов или общего контроллера. Без более глубокого анализа я бы предложил вам создать плагин Front Controller, а затем внутри preDispatch()
Метод, вы можете поговорить с базой данных и сбросить запрос, чтобы он был отправлен на правильный контроллер.
Вы также можете получить тот же эффект, используя общий контроллер, все запросы направляются на него, после чего он может перенаправить на нужный контроллер после разговора с базой данных, хотя я предпочитаю использовать плагин.
Из руководства:
preDispatch()
вызывается перед отправкой действия диспетчером. Этот обратный вызов учитывает поведение прокси или фильтра. Изменяя запрос и сбрасывая его отправленный флаг (через Zend_Controller_Request_Abstract::setDispatched(false)
), текущее действие может быть пропущено и / или заменено.
http://framework.zend.com/manual/en/zend.controller.plugins.html