Полный динамический маршрутизатор в Zend Framework - PullRequest
0 голосов
/ 23 февраля 2012

По умолчанию у вас есть следующий URL-синтаксис в ZF: / module / controller / action.Что я хочу, так это создать систему меню, в которой я могу использовать любой URL-адрес, какой захочу.

Допустим, я создаю пункт меню под названием «новости».Когда я звоню http://www.site.com/news, я хочу загрузить следующее:

  • module: news
  • controller: frontpage
  • action: display

Эти значения конфигурации должны быть настроены в записи базы данных для пункта меню.

Как я могу сделать это в Zend?Я трачу много времени на его поиски, но все еще не могу понять, как это сделать.Кто-нибудь есть?

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

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

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

0 голосов
/ 23 февраля 2012

Вы можете создать плагин и в routeStartup определить что-то, что перехватывает ваш запрос и направить /module/controller/action на /action, но для этого все имена ваших действий должны быть уникальными:

  class My_CustomRouterPlugin extends Zend_Controller_Plugin_Abstract
    {
        public function routeStartup(Zend_Controller_Request_Abstract $request)
        {

            $fc = Zend_Controller_Front::getInstance();
            $action =$fc->getRequest()->getActionName();

            $router = $fc->getRouter();

            $model= new myModel();      
            $myPage = $model->getPageByAction($action);

            $route =  new Zend_Controller_Router_Route('/action', array(
                            'module' => $myPage->getModule();
                            'controller' => $myPage->getController();
                            'action' => $action;

                        ));

             $router->addRoute($action, $route);
             return $router;
            }
    }

В myModel определитьметод может получить вам объект (или массив), который содержит имена модулей, контроллеров (из вашей БД).

и зарегистрировать этот плагин в вашем загрузчике:

$front->registerPlugin(new My_CustomRouterPlugin());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...