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 со следующим кодом

        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