Zend控制器路由器路由regex映射变量两次?早工作好,晚工作不好


Zend controller router route regex mapping variable twice? earlier working fine later not

我在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_Framework中它是这样编码的

// 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_Controller_Router_Route_Regex和扩展功能_getMappedValues(但相当丑陋)或在你的控制器中分配值action到你的preDispatch页(但相当丑陋)或改变你的应用程序设计。

如果你想要更多的信息,你应该看看Zend_Controller_Router_Route_Regex上的_getMappedValues函数