Маршрутизация в Zend Framework 2, пропустить действие «индекс» в URL-адресе, но получить идентификатор

У меня есть контроллер, который можно вызывать как modulename/xmlcoverage с действием index и некоторыми другими действиями, скажем, testAction(). URL-адрес этого контроллера — xml/coverage.

По умолчанию xml/coverage сопоставляется с моим действием index. И этот xml/coverage/test сопоставляется с testAction. Если мне нужен идентификатор для testAction, URL-адрес будет, например, xml/coverage/test/33.

Однако для действия индекса это должно быть xml/coverage/index/33, где я хотел бы, чтобы это было xml/coverage/33.

это мой маршрут

'xmlcoverage' => array(
        'type'    => 'segment',
        'options' => array(
                'route' => '/xml/coverage[/:action][/:id]',
                'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                ),
                'defaults' => array(
                        'controller' => 'modulename/xmlcoverage',
                        'action'     => 'index',
                ),
        ),
),

Пытаясь использовать URL-адрес xml/coverage/33, я считаю, что 33 должен сопоставляться с идентификатором, поскольку он не соответствует регулярному выражению действия, и оба являются необязательными. И поскольку он не соответствует действию, следует использовать значение по умолчанию (индекс).

Вместо этого я получаю сообщение об ошибке, говорящее о том, что URL-адрес не может быть сопоставлен маршрутизацией. Так что для меня это действует так, как если бы маршрут был '/xml/coverage[/:action[/:id]]', потому что я по какой-то причине должен указать действие для распознавания идентификатора.

Что я делаю неправильно и как заставить URL-адреса работать так, как мне хотелось бы? Спасибо.

EDIT: Вот проблема. Выполнение этого, на мой взгляд:

$this->url('xmlcoverage', array('action' => 'index', 'id' => $someid))

на самом деле дает URL-адрес в форме xml/coverage/1, что приведет к сбою! Изменение маршрута на /xml/coverage[/:action[/:id]], по крайней мере, заставит помощника URL-адресов создавать рабочие URL-адреса.


person Matsemann    schedule 18.07.2012    source источник
comment
Это должно действительно работать, и я проверил сгенерированное регулярное выражение в маршруте сегмента, которое успешно совпало. Вы на IRC-канале #zftalk.2 на freenode, чтобы исследовать эту проблему?   -  person DASPRiD    schedule 18.07.2012
comment
@DASPRID Я уже там. Там также есть предложение создать новый маршрут, например /xml/coverage/[:id]. Это хорошее предложение. Тем не менее, я хотел бы выяснить, почему это не работает для меня, а для вас.   -  person Matsemann    schedule 18.07.2012


Ответы (1)


После общения и отладки с хорошими ребятами из ZF2 в IRC мы обнаружили ошибку в маршрутизации.

В ходе обсуждения я сделал небольшой пример к своей проблеме, которая находится здесь. Как видно из дампа переменной здесь, действие теряется во втором случае, когда по умолчанию оно должно быть "index ".

Но если кому-то нужно, чтобы этот функционал работал прямо сейчас, вот способы, как это исправить:

  1. Вместо того, чтобы маршрут был /test[/:action][/:id], сделайте его /test[/:action[/:id]], тогда вспомогательный URL-адрес добавит /index/ и, по крайней мере, это работает.
  2. Создайте новый маршрут, где вы слушаете только /test[/:id] в дополнение к другому.
  3. В вашем контроллере сделайте public function notFoundAction() { $view = new ViewModel($this->indexAction()); //etc} своего рода хакерство, но с этой ошибкой он отправит не найденное действие, которое вы можете использовать.
person Matsemann    schedule 19.07.2012