Zend Framework中的完整动态路由器

时间:2012-02-23 12:34:02

标签: zend-framework

默认情况下,您在ZF中使用以下URL语法:/ module / controller / action。我想要的是建立一个菜单系统,我可以使用任何我想要的URL。

让我说我制作一个名为'新闻'的菜单项。当我打电话给http://www.site.com/news时,我希望下载:

  • module:news
  • controller:frontpage
  • 操作:显示

必须在菜单项的数据库记录中配置这些配置值。

我怎样才能在zend中这样做?我花了很多时间寻找它,但我仍然无法弄清楚如何。有人吗?

2 个答案:

答案 0 :(得分:1)

我建议使用前端控制器插件扫描数据库中的所有条目,根据这些条目创建路由规则并将其添加到路由器(see this)

当然建议使用缓存策略,这样您就不会对每个请求进行大量处理。

答案 1 :(得分:0)

您可以创建一个插件,并在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中定义一个方法可以获得一个包含模块,控制器名称(来自你的数据库)的对象(或数组)。

并在你的bootstrap中注册这个插件:

$front->registerPlugin(new My_CustomRouterPlugin());