Zend_Controller_Router_Route_Regex Незадължителни параметри с обратен ход

Успешно създадох своя маршрут с помощта на 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 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'
    );

Това обаче не решава проблема ми, кажете, че имам Url

/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 Framework.


person user1287238    schedule 23.03.2012    source източник


Отговори (2)


Не е възможно да се използва обратен маршрут на регулярен израз с променлив брой стойности. Можеш:

  1. Напишете различен маршрут за всеки незадължителен параметър (не се препоръчва)
  2. Използвайте различна структура на маршрута

Можете например да промените маршрута си на:

$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.

person Pieter    schedule 23.03.2012
comment
Благодаря, опитвах се да избегна необходимостта да пиша персонализиран маршрут. Ще опитам да използвам Router_Route. - person user1287238; 24.03.2012

Дали сте грешни индекси на променливи за съответствие на 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);
person darkerbg    schedule 17.04.2012
comment
Знам, че това е старо - почти толкова старо, колкото кодът, с който работя в момента ;) - но за всеки, който се занимава с това и не знае, реших да посоча причината, поради която това не е правилно, е, че (?: започва група без улавяне; stackoverflow .com/questions/3512471/ - person Andrew Dinmore; 05.03.2020