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

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

Тогда по умолчанию xml/coverage сопоставляет с моим действием индекса. И это 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/cover /33, я считаю, что 33 должен отображаться на id, так как он не соответствует регулярному выражению действия, и оба являются необязательными. А поскольку он не соответствует действию, следует использовать значение по умолчанию (индекс).

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

Что я делаю не так, и как я могу заставить URL работать так, как мне хочется? Благодарю.

РЕДАКТИРОВАТЬ: Вот проблема. Делаем это на мой взгляд:

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

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

1 ответ

Решение

После разговора и отладки с замечательными людьми из ZF2 в IRC мы обнаружили ошибку в маршрутизации.

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

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

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