我已经使用Regex成功创建了我的路线。我的路线中有几个可选参数,除非用户已指定,否则我不想在URL帮助器中显示这些参数。我该怎么做?

这是我目前所拥有的

        $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帮助器
        echo $this->url(array('page' => $page), 'color_widgets', false);

这将导致/ Blue-Widgets /,并且不会将Page发送到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);

他们实际上被带到
/ Blue-Widgets / page / 2 / limit / 10

当我真的想带他们去
/ Blue-Widgets / page / 2

我如何使用Zend框架来完成此任务。

最佳答案

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

  • 为每个可选参数写一条不同的路由(不推荐)
  • 使用其他路由结构

  • 例如,您可以将路线更改为:
    $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。

    10-08 07:54