Php Zend controller路由器路由正则表达式映射变量两次?早起工作好,晚点不好

Php Zend controller路由器路由正则表达式映射变量两次?早起工作好,晚点不好,php,regex,zend-framework,routing,Php,Regex,Zend Framework,Routing,我在routes.ini中配置了以下路由 routes.frontnoncms.type = "Zend_Controller_Router_Route_Regex" routes.frontnoncms.route = "/?([a-zA-Z0-9_-]+)?/?(newsletter|contactus|accessability|search)/?([a-zA-Z0-9_-]+)?/?([a-zA-Z0-9_-]+)?" routes.frontnoncms.defaults.module

我在routes.ini中配置了以下路由

routes.frontnoncms.type = "Zend_Controller_Router_Route_Regex"
routes.frontnoncms.route = "/?([a-zA-Z0-9_-]+)?/?(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.locale = 1
routes.frontnoncms.map.action = 2
routes.frontnoncms.map.page = 2
routes.frontcms.map.subpage = 3
routes.frontcms.map.num = 4
如果您注意到参数2被指定了两次

routes.frontnoncms.map.action=2

routes.frontnoncms.map.page=2

结果是

array(4) { ["locale"]=> string(2) "en" ["action"]=> string(9) "contactus" ["module"]=> string(15) "frontManagement" ["controller"]=> string(5) "Front" }
数组中有一个action元素,但没有Page元素

所以我交换了他们的位置,把页面线移到动作线的上方。像这样的

routes.frontnoncms.type = "Zend_Controller_Router_Route_Regex"
routes.frontnoncms.route = "/?([a-zA-Z0-9_-]+)?/?(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.locale = 1
routes.frontnoncms.map.page = 2
routes.frontnoncms.map.action = 2
routes.frontcms.map.subpage = 3
routes.frontcms.map.num = 4
现在的结果是这样的

array(4) { ["locale"]=> string(2) "en" ["page"]=> string(9) "contactus" ["module"]=> string(15) "frontManagement" ["controller"]=> string(5) "Front" }
现在数组中有Page元素,但这次Action元素消失了

这是否意味着,我只能指定一个参数一次?我不会分配两次吗?
因为以后不行了

您不能这样做,因为在Zend_框架中,它是这样编码的

// params of the function
$values = array(1 => 'en_GB', 2 => 'index', 3 => 'awesome-subpage');

foreach ($values as $key => $value) {
    if (array_key_exists($key, $this->_map)) {
        $index = $this->_map[$key];
    } elseif (false === ($index = array_search($key, $this->_map))) {
        $index = $key;
    }
    $return[$index] = $values[$key];
}
它通过键(1,2,3,4)执行,只需检查键是否有映射名称(如页面),然后继续,因此如果一个键有两个映射名称,则该键不起作用

如果您想实现这一点,您必须扩展
Zend\u Controller\u Router\u Route\u Regex
并扩展函数
\u getMappedValues
(但相当难看),或者在控制器中将值操作指定到
preDispatch
(但相当难看)中的页面,或者更改应用程序设计


如果您想了解更多信息,请查看
Zend\u Controller\u Router\u Route\u Regex上的
\u getMappedValues
函数。我可以问您为什么要这样做吗?我期待这个问题:)我只是好奇:)为什么它不能像htaccess那样工作。好奇害死猫!!也许这有用??我真的不确定,但是
routes.frontnoncms.map.page=routes.frontnoncms.map.action
讨厌人们问为什么:)这是我实现的一部分。不错的尝试:)但我已经试过了。它不起作用。任何其他猜测;)