Я работаю над проектом, который должен использовать схему MVC, управляемую базой данных, где путь к контроллерам и представлениям контролируется через единую таблицу базы данных. Однако мне не удалось найти никаких руководств, которые демонстрируют это с текущей версией фреймворка (все они, похоже, были написаны несколько версий назад), и мне было интересно, делал ли кто-нибудь что-то подобное с более поздней версией. структуры, или если кто-нибудь знает блоги или учебные пособия, в которых обсуждается, как сделать это простым способом.
Основная идея состоит в том, что будет таблица sitePage, которая будет содержать поля pageName, controller, module и view. Когда запрос обрабатывается, мне нужно запросить базу данных для данного pageName и определить соответствующий контроллер, модуль и представление, а затем передать это в необходимый класс Zend, чтобы продолжить нормальную маршрутизацию и обработку запроса.
Заранее спасибо.






Возможно, лучший подход - не использование маршрутизаторов, а использование плагинов или общего контроллера. Без более глубокого анализа я бы посоветовал вам создать подключаемый модуль Front Controller, а затем внутри метода preDispatch() вы можете поговорить с базой данных и сбросить запрос, чтобы он был отправлен на правильный контроллер.
Вы также можете получить тот же эффект, используя общий контроллер, все запросы маршрутизируются на него, а затем он может перенаправить на правильный контроллер после разговора с базой данных, хотя я предпочитаю использовать плагин.
Из Руководства:
preDispatch() вызывается перед отправкой действия диспетчером. Этот обратный вызов позволяет использовать прокси или фильтр. Изменяя запрос и сбрасывая его флаг отправки (через Zend_Controller_Request_Abstract::setDispatched(false)), текущее действие можно пропустить и / или заменить.
http://framework.zend.com/manual/en/zend.controller.plugins.html
Я понял, что действительно более элегантным подходом является использование маршрутизатора, но для этого вам потребуется создать собственный, расширив класс Zend_Controller_Router_Abstract и реализовав метод «маршрута».
Вы получаете объект Zend_Controller_Request_Abstract в качестве параметра метода "маршрута". Там вы можете поговорить с базой данных, а затем использовать:
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);
}
}
}