Учебные пособия для маршрутизации на основе базы данных в Zend Framework? - PullRequest
4 голосов
/ 19 декабря 2008

Я работаю над проектом, который должен использовать схему MVC, управляемую базой данных, где маршрут к контроллерам и представлениям управляется через единую таблицу базы данных. Тем не менее, я не смог найти никаких учебных пособий, демонстрирующих это с текущей версией фреймворка (кажется, все они написаны несколько версий назад), и мне было интересно, если кто-нибудь сделал что-то подобное с более свежей версией или если кто-то знает блоги или учебные пособия, в которых обсуждается, как это сделать простым способом.

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

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 05 апреля 2011

Вы также можете использовать метод 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);
        }

     }

 }
2 голосов
/ 20 декабря 2008

Я понял, что более элегантный подход - это использование маршрутизатора, но для этого вам нужно создать собственный, расширив класс 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()

, чтобы определить свой маршрут.

Надеюсь, это поможет!

2 голосов
/ 20 декабря 2008

Возможно, лучший подход - это не использование маршрутизаторов, а использование плагинов или общего контроллера. Без более глубокого анализа я бы предложил вам создать плагин Front Controller, а затем в методе preDispatch() вы можете обратиться к базе данных и сбросить запрос, чтобы он был отправлен на нужный контроллер.

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

Из руководства:

preDispatch() вызывается перед отправкой действия диспетчером. Этот обратный вызов учитывает поведение прокси или фильтра. Изменяя запрос и сбрасывая его отправленный флаг (через Zend_Controller_Request_Abstract::setDispatched(false)), текущее действие может быть пропущено и / или заменено.

http://framework.zend.com/manual/en/zend.controller.plugins.html

...