zend routes ini - 将优先级一个规则赋予另一个规则或定义顺序

时间:2011-08-11 12:18:54

标签: regex zend-framework routes

我在routes.ini文件中遵循以下两条规则

routes.frontcms.type = "Zend_Controller_Router_Route_Regex"
routes.frontcms.route = "/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?"
routes.frontcms.defaults.module = frontManagement
routes.frontcms.defaults.controller = Front
routes.frontcms.defaults.action = cmspages
routes.frontcms.map.locale = 1
routes.frontcms.map.page = 2
routes.frontcms.map.subpage = 3
routes.frontcms.map.num = 4


routes.frontnoncms.type = "Zend_Controller_Router_Route_Regex"
routes.frontnoncms.route = "/?([a-z]{2}+)?/?(newsletter|contactus|accessability|search)?/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?"
routes.frontnoncms.defaults.module = frontManagement
routes.frontnoncms.defaults.controller = Front
routes.frontnoncms.map.action = 2
routes.frontnoncms.map.locale = 1
routes.frontnoncms.map.page = 2

当我执行此网址时http://zf-cms.local/en/contactus 我得到以下结果。这是预料之中的。它执行了第二条规则

Array ( [locale] => en [action] => contactus [module] => frontManagement [controller] => Front )

当我执行此网址时http://zf-cms.local/en/privacy_policy 以下是结果

Array ( [locale] => en [action] => [3] => privacy_policy [module] => frontManagement [controller] => Front ) 

它应该执行第一条规则。但由于冲突,它无法决定执行哪一个。 是否有任何可能性我们可以定义第一个检查第二个规则的顺序,如果它没有被检查,则检查第二个。某种优先顺序或订单?

任何一个人面临同样的问题?

1 个答案:

答案 0 :(得分:4)

以相反的顺序检查路线,以便它已按您希望的方式工作。您的问题是http://zf-cms.local/en/privacy_policy与第二条路由中的正则表达式匹配,因此路由器不需要检查其他任何内容。

供参考,这是你的模式:

"/?([a-z]{2}+)?/?(newsletter|contactus|accessability|search)?/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?"

因此,如果我们将其分解为位,则路径/en/privacy_policy的匹配方式如下:

([a-z]{2}+)/? -> matches en/
(newsletter|contactus|accessability|search)?/? -> optional, so is skipped
([a-zA-Z0-9_-]+)?/? -> matches privacy_policy
([a-zA-Z0-9_-]+)? -> optional, so is skipped

取决于您的网址的结构,最简单的解决方案可能是通过删除?来使第二部分非可选的?在它之后:

"/?([a-z]{2}+)?/?(newsletter|contactus|accessability|search)/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?"