zend routes ini按优先级顺序加载路由。

时间:2012-06-20 10:44:56

标签: zend-framework

Zend Project包含多个模块,每个模块都有自己的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 ...)并按特定顺序加载它们以便它将检查路由按顺序我定义。

模块的典型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

3 个答案:

答案 0 :(得分:0)

我不相信你可以指定订单。您必须编写自己的代码才能执行此操作。我确定有多种方法,但您是否考虑过编写自定义Zend Controller Plugin?你可以制作一个并在routeStartup()方法中组装你的路线。

答案 1 :(得分: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()方法。

祝你好运!

答案 2 :(得分:0)

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

为此,我引用了Zend_Controller_Router_Rewrite的代码。重要的功能是addRoute()route()。我的结论非常简单:路径以oposit顺序进行评估,比较application.ini中的顺序。

示例:

如果我在application.ini中写道

routeA

routeB

routeC

首先检查

routeC ,然后在 routeA 之后检查 routeB

优先级 routeC >优先级 routeB >优先级 routeA