Zend_Controller_Router_Route_Regex具有反向的可选参数

时间:2012-03-23 00:58:32

标签: zend-framework zend-route zend-view

我使用正则表达式成功创建了我的路线。我的路由中有几个可选参数,我不希望在URL Helper中显示,除非用户指定了它们。我怎么能做到这一点?

这就是我目前所拥有的

        $route = new Zend_Controller_Router_Route_Regex(
        '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))',
        array(
            'controller'    => 'widget',
            'action'        => 'list',
        ),
        array(
            1 => 'color',
            2 => 'page',
            3 => 'limit'

        ),
        '%s-Widgets/'
    );

    $router->addRoute('color_widgets', $route);

然后我使用以下代码调用URL Helper

        echo $this->url(array('page' => $page), 'color_widgets', false); 

这会导致/ Blue-Widgets /并且不会将页面发送到URL。我可以通过改变路由器中的反向来解决这个问题

    $route = new Zend_Controller_Router_Route_Regex(
        '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))',
        array(
            'controller'    => 'widget',
            'action'        => 'list',
            'page'      => 1
        ),
        array(
            1 => 'color',
            2 => 'page',
            3 => 'limit'

        ),
        '%s-Widgets/page/%d'
    );

然而,这并没有解决我的问题,说我有一个网址

/ Blue-Widgets / page / 1 / limit / 10没有显示限制,我可以再次使用以下内容解决此问题

    $route = new Zend_Controller_Router_Route_Regex(
        '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))',
        array(
            'controller'    => 'widget',
            'action'        => 'list',
            'page'      => 1,
            'limit'     => 10
        ),
        array(
            1 => 'color',
            2 => 'page',
            3 => 'limit'

        ),
        '%s-Widgets/page/%d/limit/%d'
    );

这个问题是用户所在 / Blue-Widgets /我希望带着以下代码将它们带到Blue Widgets的下一页

        echo $this->url(array('page' => $page), 'color_widgets', false); 

他们实际上被带到了 /蓝小部件/页/ 2 /限制/ 10

当我真的想带他们去 /蓝小部件/页/ 2

如何使用Zend Framework实现这一目标。

2 个答案:

答案 0 :(得分:2)

不可能使用具有可变数值的正则表达式反向路由。 你可以:

  1. 为每个可选参数(不推荐)编写不同的路径
  2. 使用不同的路线结构
  3. 您可以将路线更改为:

    $route = new Zend_Controller_Router_Route(
        'widgets/:color/*',
        array(
            'controller'    => 'widget',
            'action'        => 'list',
            'page'      => 1,
            'limit'     => 10
        ),
        array(
            'color' => '[a-zA-Z-_0-9-]+',
            'page' => '\d+',
            'limit' => '\d+',
        )
    );
    

    另一个选择是创建自己的自定义路由类,它可以解析和构建正确的uri。

答案 1 :(得分:0)

你给出了错误的Regex匹配变量索引,这就是你得到奇怪结果的原因。您的代码应如下所示:

$route = new Zend_Controller_Router_Route_Regex(
'([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))',
array(
    'controller'    => 'widget',
    'action'        => 'list',
),
array(
    1 => 'color',
    3 => 'page',
    5 => 'limit'
),
'%s-Widgets/'
);

$router->addRoute('color_widgets', $route);