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
答案 0 :(得分:0)
我不相信你可以指定订单。您必须编写自己的代码才能执行此操作。我确定有多种方法,但您是否考虑过编写自定义Zend Controller Plugin?你可以制作一个并在routeStartup()
方法中组装你的路线。
答案 1 :(得分:0)
可以做到,但需要做一些工作,你需要对ZF相当满意。
您需要扩展Zend_Controller_Router_Rewrite
以创建自己的路由器类(您需要使用引导程序中的前端控制器的setRouter()方法进行设置)。在您的路由器类中,您需要:
扩展addRoute
方法以添加指示优先级的第三个参数。 (这可以是常量,如Your_Router::HIGH_PRIORITY
,Your_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