0

Zend 项目有多个模块,每个模块都在其中定义了自己的 routes.ini。并且每个 routes.ini 文件都使用基于模块的引导文件中的以下脚本加载。

 protected function _initRoutes() {
            $frontController = Zend_Controller_Front::getInstance();
            $router = $frontController->getRouter();
            $routerDir = realpath(dirname(__FILE__)). "/configs/routes/moduleRoutes.ini";
            $config = new Zend_Config_Ini($routerDir,'production');
            $router->addConfig($config,'routes');
    }

并且所有路线都在无序加载。因为路由是按照加载顺序的相反顺序检查的,它首先检查/执行那些应该稍后检查/执行的路由。

有没有一种方法可以在每个模块的 routes.ini 文件中为每个路由添加一个 orderBy 位(1,2,3,4 ...),并按特定顺序加载它们,以便它按顺序检查路由 I定义。

模块的典型 routes.ini 文件如下所示。

routes.frontindex.type = "Zend_Controller_Router_Route_Regex"
routes.frontindex.route = "/?(?!login/)([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?/?([0-9_-]+)?"
routes.frontindex.defaults.module = mymodule1
routes.frontindex.defaults.controller = mycontroller1
routes.frontindex.map.page = 1

routes.siteimage.type = "Zend_Controller_Router_Route_Regex"
routes.siteimage.route = "siteimage/?([a-zA-Z0-9_-]+)?/?(jpg|png|gif)?"
routes.siteimage.defaults.module = mymodule1
routes.siteimage.defaults.controller = mycontroller2
routes.siteimage.defaults.action = getimage
routes.siteimage.map.imageid = 1


routes.sitemapseo.type = "Zend_Controller_Router_Route_Static"
routes.sitemapseo.route = "sitemap.xml"
routes.sitemapseo.defaults.module = mymodule1
routes.sitemapseo.defaults.controller = mycontroller3
routes.sitemapseo.defaults.action = sitemap
4

3 回答 3

0

我不相信你可以指定一个订单。您必须编写自己的代码才能做到这一点。我敢肯定有多种方法,但是您是否考虑过编写自定义Zend 控制器插件?您可以制作一个并在方法内组装您的路线routeStartup()

于 2012-06-20T18:12:34.197 回答
0

可以做到,但需要一些工作,并且您需要对 ZF 相当熟悉。

您需要扩展Zend_Controller_Router_Rewrite以创建自己的路由器类(您需要在引导程序中使用前端控制器的 setRouter() 方法进行设置)。在您的路由器类中,您需要:

  • 扩展该addRoute方法以添加指示优先级的第三个参数。(这可能是一个常数,例如 等Your_Router::HIGH_PRIORITYYour_Router::MEDIUM_PRIORITY或者只是一个数字)。您会看到现有方法将路由存储在一个名为_routes. 您可以根据优先级参数(等)将路线存储在不同的$this->_highPriorityRoutes数组$this->_lowPriorityRoutes

  • 扩展route()方法。不幸的是,其中大部分将被剪切和粘贴。但是你会看到它调用array_reverse然后$this->_routes循环通过这些来进行匹配。您需要将您的路由数组合并在一起,以便最终结果是一个优先级最高的路由数组。所以你最终可能会得到类似的东西:

    $routes = array_merge($this->_lowPriorityRoutes, $this->_highPriorityRoutes);
    $routes = array_reverse($routes, true);
    
    foreach ($routes as $name => $route) {
        (...as before)
    
  • 更新您的 ini 文件以向您的路线添加一个参数来指示优先级。然后在路由器类中扩展该addConfig()方法,以便将此参数传递给该addRoute()方法。

祝你好运!

于 2012-06-20T20:56:21.003 回答
0

我还尝试为 application.ini 中的路由设置优先级。

为此,我阅读了Zend_Controller_Router_Rewrite. 重要的函数是addRoute()route()。我的结论很简单:路由以相反的顺序评估,比较 application.ini 中的顺序。

例子 :

如果我写在 application.ini

路线A

路线B

路线C

首先检查 routeC,然后检查routeB最后检查routeA

优先路由C > 优先路由B > 优先路由A

于 2014-04-07T15:12:25.387 回答