2012-02-23 87 views
0

默认情况下,您在ZF中具有以下URL语法:/ module/controller/action。我想要的是建立一个菜单系统,我可以使用任何我想要的网址。Zend Framework中的全动态路由器

比方说我做一个菜单项称为“新闻”。当我打电话http://www.site.com/news我想有如下因素加载:

  • 模块:新闻
  • 控制器:头版
  • 行动:显示

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

我该如何在zend中做到这一点?我花了很多时间寻找它,但我仍然无法弄清楚如何去做。有人吗?

回答

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定义一个方法可以让你一个包含模块,控制器名称(来自你的数据库)的对象(或数组)。

并注册这个插件在你的引导:

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

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

当然缓存战略的建议,这样你就不会做了很多处理的每个请求。

+0

我不能只是只装入用过的物品? – 2012-02-23 13:15:40

+0

是的,你可以。但是,如果你想产生很好的链接到其他页面(使用'url'视图助手),你将需要所有(好,可能全部)定义的路线。 – bububaba 2012-02-23 13:24:17

+0

这是一个很好的;-) – 2012-02-23 14:02:35