【问题标题】:Full dynamic router in Zend FrameworkZend 框架中的全动态路由器
【发布时间】:2012-03-13 20:46:00
【问题描述】:

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

假设我制作了一个名为“新闻”的菜单项。当我打电话给http://www.site.com/news 时,我想加载以下内容:

  • 模块:新闻
  • 控制者:首页
  • 动作:显示

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

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

【问题讨论】:

    标签: zend-framework


    【解决方案1】:

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

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

    【讨论】:

    • 我不能只加载使用过的物品吗?
    • 是的,你可以。但是,如果您想生成指向其他页面的漂亮链接(使用 url 视图助手),则无论如何都需要定义所有(嗯,可能是所有)路由。
    【解决方案2】:

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

    并在您的引导程序中注册此插件:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多